C++经典面试算法题
转自:http://blog.csdn.net/f_r_e_e_x/article/details/50770907
//1.实现strcpy.
char* MyStrCpy( char *pDest, const char *pSrc )
{
if( nullptr == pDest || nullptr == pSrc )
{
return nullptr;
}
if( pDest == pSrc )
{
return pDest;
}
char *pIter = pDest;
while( ( *pIter++=*pSrc++ ) !='\0' );
return pDest;
}
//2.实现strcat.
char* MyStrCat( char *pDest, const char *pSrc )
{
if( nullptr == pDest || nullptr == pSrc )
{
return nullptr;
} char *pIter = pDest + strlen( pDest );
while( ( *pIter++=*pSrc++ ) != '\0' );
return pDest;
}
//3.实现CString字符串类缺省四个方法
class MyCString
{
public: MyCString( char *pData = nullptr )
{
if( nullptr == pData )
{
mpData = new char[ ];
assert( nullptr != mpData );
*mpData = '\0';
}
else
{
mpData = new char[ strlen( pData ) + ];
assert( nullptr != mpData );
strcpy( mpData, pData );
}
} MyCString( const MyCString &Other )
{
mpData = new char[ strlen( Other.mpData ) + ];
assert( nullptr != mpData );
strcpy( mpData, Other.mpData );
} ~MyCString()
{
if( nullptr != mpData )
{
delete [] mpData;
mpData = nullptr;
}
} const MyCString& operator =( const MyCString &Other )
{
if( this == &Other )
{
return *this;
}
delete [] mpData;
mpData = new char[ strlen( Other.mpData ) + ];
assert( nullptr != mpData );
strcpy( mpData, Other.mpData );
return *this;
} private: char *mpData;
};
//4.不使用第三个变量交换两个数的值
void SwapA( int &A, int &B )
{
if( A == B )
{
return;
}
A = A + B;
B = A - B;
A = A - B;
}
void SwapB( unsigned int &A, unsigned int &B )
{
if( A == B )
{
return;
}
A = A ^ B;
B = A ^ B;
A = A ^ B;
}
//5.C语言中字符串转数字的方法是什么( atoi ),请实现它
int Myatoi( const char *pString )
{
assert( nullptr != pString );
const int Len = strlen( pString );
int Value = ;
int Times = ;
for( int i = Len -; i >= ; --i, Times *= )
{
Value += ( pString[ i ] - '' ) * Times;
}
return Value;
}
//6.实现一个将字符串逆序的方法
char* MyInverted( char *pDest )
{
assert( nullptr != pDest );
const int Len = strlen( pDest );
char T = ;
for( int i = ; i < Len / ; ++i )
{
T = pDest[ i ];
pDest[ i ] = pDest[ Len - i - ];
pDest[ Len - i - ] = T;
}
return pDest;
}
//7.实现一个将字符串中所有字母转换为大写的方法
char* MyUpper( char *pDest )
{
assert( nullptr != pDest );
for( char *i = pDest; *i != '\0'; ++i )
{
if( *i < 'a' || *i > 'z' )
{
continue;
}
*i -= 'a' - 'A';
}
return pDest;
}
//8.已知一个数组已经降序排序请用二分查字法找到其中的某个元素找到返回索引否则返回-1
int BinarySearch( int *pArray, int Count, int Value )
{
assert( nullptr != pArray );
int Left = ;
int Right = Count -;
int Mid = ;
while( Left <= Right )
{
Mid = ( Left + Right ) / ;
if( Value < pArray[ Mid ] )
{
Right = Mid - ;
}
else if( Value > pArray[ Mid ] )
{
Left = Mid + ;
}
else
{
return Mid;
}
}
return -;
} struct Node
{
Node *mpNext;
int mData;
};
//9.删除链表中值为Value的所有元素( [Head]->[node1]->[node2]->...[noden] )
void DeleteFromList( Node *pHead, int Value )
{
Node *pPrev = pHead;
Node *pNext = pHead->mpNext;
while( nullptr != pNext )
{
if( pNext->mData != Value )
{
pPrev = pNext;
pNext = pNext->mpNext;
}
else
{
pPrev->mpNext = pNext->mpNext;
delete pNext;
pNext = pPrev->mpNext;
}
}
}
//10.在链表Index位置插入新的值为Value的元素
void InsertFromList( Node *pHead, int Index, int Value )
{
Node *pIter = pHead;
for( int i = ; i < Index && nullptr != pIter; ++i, pIter = pIter->mpNext );
assert( nullptr != pIter );
Node *pNew = new Node;
pNew->mData = Value;
pNew->mpNext = pIter->mpNext;
pIter->mpNext = pNew;
}
//11.将链表逆序
Node* InvertedFromList( Node *pHead )
{
//A->B->C
Node *pPrev = pHead; //A
Node *pNext = pHead->mpNext; //B
Node *pNextNext = nullptr; //C
while( nullptr != pNext )
{
pNextNext = pNext->mpNext; //C = B->C
pNext->mpNext = pPrev; //B->A pPrev = pNext; //A = B
pNext = pNextNext; //B = C
}
pHead->mpNext = nullptr;//C->B->A->null
return pPrev; //return C( new head )
}
//12.判断X年X月X日是这年的第几天
int GetDay( int Year, int Month, int Day )
{
int MonthDays[ ] = { , , , , , , , , , , , , }; if( ( Year % == && Year % != ) || ( Year % == ) )
{
++MonthDays[ ];
} int Days = ;
for( int i = ; i < Month; ++i )
{
Days += MonthDays[ i ];
}
Days += Day; return Days;
}
//13.求斐波拉契数列第N项
int GetFibonacci1( int N )
{
if( == N || == N )
{
return ;
}
if( == N )
{
return ;
}
int A = ;
int B = ;
int C = ;
for( int i = ; i < N - ; ++i )
{
C = A + B;
A = B;
B = C;
}
return C;
}
//14.递归求斐波拉契数列数列第N项
int GetFibonacci2( int N )
{
if( == N || == N )
{
return ;
}
return GetFibonacci2( N - ) + GetFibonacci2( N - );
}
//15.实现一个产生[N-M]区间数字的随机方法
int GetRandomRange( int N, int M )
{
if( N == M )
{
return N;
}
if( N > M )
{
N = N + M;
M = N - M;
N = N - M;
}
return N + ( rand() % ( M - N + ) );
}
//16.实现一个产生[0~1]之间的随机浮点数
double GetRandomRange()
{
return rand() / static_cast< double >( RAND_MAX );
}
//17.实现一个打印出1-1000之间的所有素数的方法
void PrintfPrime()
{
//1不是素数
//2是最小非奇数素数
//直接从3开始
printf( "2\n" );
bool b = false;
for( int i = ; i <= ; ++i )
{
b = true;
for( int j = ; j <= i / ; ++j )
{
if( i % j == )
{
b = false;
break;
}
}
if( b )
{
printf( "%d\n", i );
}
}
}
//18.已知Z = X + Y 其中 Z, X, Y 均为无符号int型 定义一个宏判断Z是否已经越界 #define IS_OVER_FLOW( Z, X, Y ) ( Z < ( ( X ) < ( Y ) ? ( Y ) : ( X ) ) )
//19.请用栈实现队列
int QueuePop( std::stack< int > &StackA )
{
std::stack< int > StackB;
while( false == StackA.empty() )
{
StackB.push( StackA.top() );
StackA.pop();
} const int top = StackB.top();
StackB.pop(); while( false == StackB.empty() )
{
StackA.push( StackB.top() );
StackB.pop();
}
return top;
}
//20.已知X班X成绩0-100分编写一个方法实现0-59打印不合格,60-69打印合格,70-79打印良好,80-100打印优秀
//不能使用if,:?,switch
void PrintScore( int Score )
{
assert( Score >= && Score <= );
const char *pString[] =
{
"不合格",
"不合格",
"不合格",
"不合格",
"不合格",
"不合格",
"合格",
"良好",
"优秀",
"优秀",
"优秀",
};
printf( "%s\n", pString[ Score / ] );
}
//21.实现strncpy
char *Mystrncpy( char *pDest, const char *pSrc, int Count )
{
assert( NULL != pDest && NULL != pSrc );
if( pDest == pSrc )
{
return pDest;
}
if( Count <= )
{
return pDest;
}
char *pStart = pDest;
while( ( Count-- ) > && ( *pStart++=*pSrc++ ) );
*pStart = '\0';
return pDest;
}
//22.C语言中数字转字符串的方法是什么?(itoa)请实现他
char* Myitoa( char *pDest, int val, int radix )
{
assert( NULL != pDest );
assert( radix > );
const bool IsMinu = val < ;
char buffer[ ] = {};
int count = ; do
{
buffer[ count++ ] = abs(val) % radix;
val /= radix;
}
while( val ); if( IsMinu )
{
pDest[ ] = '-';
for( int i = ; i < count; ++i )
{
pDest[ i + ] = '' + buffer[ count - i - ];
}
pDest[ count + ] = '\0';
}
else
{
for( int i = ; i < count; ++i )
{
pDest[ i ] = '' + buffer[ count - i - ];
}
pDest[ count ] = '\0';
}
return pDest;
}
//23.如何判断链表是否有环
bool IsLoop( Node *pHead )
{
//[H->A->B->C->A]
assert( NULL != pHead );
Node *pNext = pHead->mpNext;
Node *pNextNext = pHead->mpNext;
while( NULL != pNext && NULL != pNextNext->mpNext )
{
pNext = pNext->mpNext;//[ B、C、A ]
pNextNext = pNextNext->mpNext->mpNext;//[C、B、A]
if( pNext == pNextNext )
{
return true;
}
}
return false;
}
//24.统计出一个字符串每种字母出现的次数要求时间复杂度为O(n)
void CountLetter( const char *pSrc )
{
int count[ ] = {};
for( ; *pSrc !='\0'; ++pSrc )
{
const char &c = *pSrc;
if( ( c < 'A' || c > 'z') && ( c < 'a' || c > 'z' ) )
{
continue;
}
++count[ c ];
}
}
//25.选择排序的思想是什么?( 每次找到最大或最小的值放在数组的低位上 )请实现它
void SelectSort( int *pArray, int count )
{
for( int i = ; i < count; ++i )
{
//默认低位元素最小
int MinValue = pArray[ i ];
//默认保存低位元素的索引
int MinIndex = i;
//除开第一个元素找是否还有比它还小的元素( 升序 )
for( int j = i + ; j < count; ++j )
{
//发现找到比它还小的元素重新赋值和保存索引
if( pArray[ j ] < MinValue )
{
MinValue = pArray[ j ];
MinIndex = j;
}
}
//将找到最小元素放在数组低位上面
const int Temp = pArray[ i ];
pArray[ i ] = MinValue;
pArray[ MinIndex ] = Temp;
}
}
//26.冒泡排序的思想是什么?(升序排序中越小的数往低位走,越大的数往高位走,每次与相邻元素比较导致的特点)请实现它
void BubbleSort( int *pArray, int count )
{
//eg.[6][8][8][0][9][1]
//i = 0,j < 5 [6][8][0][8][1][9]
//i = 1,j < 4 [6][0][8][1][8][9]
//i = 2,j < 3 [0][6][1][8][8][9]
//i = 3,j < 2 [0][1][6][8][8][9] //到此为止已经排序OK了
//i = 4,j < 1 [0][1][6][8][8][9]
//i = 5,j < 0 [0][1][6][8][8][9]
for( int i = ; i < count; ++i )
{
for( int j = ; j < count - i - ; ++j )
{
if( pArray[ j ] > pArray[ j + ] )
{
const int Temp = pArray[ j ];
pArray[ j ] = pArray[ j + ];
pArray[ j + ] = Temp;
}
}
}
}
//27.已知两个数组有序实现一个方法将他们合并后任然有序
void MergeSort( int *pMerge, int *p1, int p1len, int *p2, int p2len )
{
assert( nullptr != pMerge && nullptr != p1 && nullptr != p2 );
int i = ;
int j = ;
int k = ;
while( i < p1len && j < p2len )
{
if( p1[ i ] < p2[ j ] )
{
pMerge[ k ] = p1[ i ];
++k;
++i;
}
else
{
pMerge[ k ] = p2[ j ];
++k;
++j;
}
}
while( i < p1len )
{
pMerge[ k ] = p1[ i ];
++k;
++i;
}
while( j < p2len )
{
pMerge[ k ] = p2[ j ];
++k;
++j;
}
}
//28.实现一个算法找到数组中第二大的数
int FindSec( int *p, int len )
{
assert( nullptr != p );
int maxv = p[ ];
int secv = p[ ];
for( int i = ; i < len; ++i )
{
if( maxv < p[ i ] )
{
secv = maxv;
maxv = p[ i ];
}
}
return secv;
}
C++经典面试算法题的更多相关文章
- python经典面试算法题1.4:如何对链表进行重新排序
本题目摘自<Python程序员面试算法宝典>,我会每天做一道这本书上的题目,并分享出来,统一放在我博客内,收集在一个分类中. 1.4 对链表按照如下要求重新排序 [微软笔试题] 难度系数: ...
- python经典面试算法题1.3:如何计算两个单链表所代表的数之和
本题目摘自<Python程序员面试算法宝典>,我会每天做一道这本书上的题目,并分享出来,统一放在我博客内,收集在一个分类中. 1.2 如何实现链表的逆序 [华为笔试题] 难度系数:⭐⭐⭐ ...
- python经典面试算法题1.2:如何从无序链表中移除重复项
本题目摘自<Python程序员面试算法宝典>,我会每天做一道这本书上的题目,并分享出来,统一放在我博客内,收集在一个分类中. 1.2 如何实现链表的逆序 [蚂蚁金服面试题] 难度系数:⭐⭐ ...
- python经典面试算法题4.1:如何找出数组中唯一的重复元素
本题目摘自<Python程序员面试算法宝典>,我会每天做一道这本书上的题目,并分享出来,统一放在我博客内,收集在一个分类中. [百度面试题] 难度系数:⭐⭐⭐ 考察频率:⭐⭐⭐⭐ 题目描述 ...
- python经典面试算法题1.1:如何实现链表的逆序
本题目摘自<Python程序员面试算法宝典>,我会每天做一道这本书上的题目,并分享出来,统一放在我博客内,收集在一个分类中. 1.1 如何实现链表的逆序 [腾讯笔试题] 难度系数:⭐⭐⭐ ...
- 合并K个有序数组(链表)【字节跳动面试算法题】
本题是本人字节跳动一面考的算法题原题是有序数组,一时没想到怎么解决数组的问题,但是如果给的是有序链表数组,则可以用下面的方法解决 可以利用最小堆完成,时间复杂度是O(nklogk),具体过程如下: 创 ...
- 剑指offer中经典的算法题之从头到尾打印链表
话不多说上代码: 我自己的算法是: /** * public class ListNode { * int val; * ListNode next = null; * * ListNode(int ...
- 19道常见的JS面试算法题
最近秋招也做了多多少少的面试题,发现除了基础知识外,算法还是挺重要的.特意整理了一些常见的算法题,添加了自己的理解并实现. 除此之外,建议大家还可以刷刷<剑指offer>.此外,左神在牛客 ...
- php最常见最经典的算法题
1.一群猴子排成一圈,按1,2,…,n依次编号.然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去…,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫 ...
随机推荐
- 【题解】cycle
[题解]cycle 题目描述 给定一个无向图,求一个环,使得环内边权\(\div\)环内点数最大. 数据范围 \(n \le 5000\) \(m\le 10000\) \(Solution\) 考虑 ...
- Versions 崩溃(Mac升级OS X Yonsemite 10.10)
今天兴冲冲的升级到了OS X Yonsemite 10.10,结果发现SVN工具不能用了,于是找到一个暂时的解决的方法 1.打开目录~/.subversion/servers 2.在[global] ...
- jetty使用jndi数据源
之前将项目正常的数据源统一切换成jndi访问的形式(是将c3p0以mbean形式安装到jboss做的数据连接池), 本地测试用的jetty服务器,为了统一数据库访问部分,我也查看文档找到了jetty提 ...
- blog真正的首页
声明:此Django分类下的教程是追梦人物所有,地址http://www.jianshu.com/u/f0c09f959299,本人写在此只是为了巩固复习使用 上一节我们阐明了django的开发流程, ...
- Hadoop- Hadoop环境搭建
Windows下Hadoop的安装 准备工具:64位的JDK,Hadoop安装包(我使用的是2.6.1) JDK下载地址 官网: http://www.oracle.com/technetwork/j ...
- html5实现进度条功能效果非常和谐
1. [图片] html5.jpg 2. [代码][HTML]代码 <script type="text/javascript"> var i = 0; ...
- jQuery选项卡tabulous
jQuery选项卡tabulous,jQuery,选项卡,tab标签切换代码,扁平设计,jQuery选项卡tabulous是一款支持Scale.Slide.Scale Up.Flip等效果jquery ...
- ES禁用_source不会影响聚合
From Elasticsearch's website: The _source field contains the original JSON document body that was pa ...
- 【boost】使用serialization库序列化子类
boost.serialization库是一个非常强大又易用的序列化库,用于对象的保存与持久化等. 使用base_object可以在序列化子类的同时也序列化父类,以此获得足够的信息来从文件或网络数据中 ...
- #基础概念#之tensor
中译名:张量 定义: from wiki: In mathematics, tensors are geometric objects that describe linear relations b ...