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只,在把它踢出去…,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫 ...
随机推荐
- Dijkstra的堆优化
先附上一个例题:P3371 [模板]单源最短路径 一眼扫去,最短路... spfa可行,但是今天的主题是Dijkstra: #include<iostream> #include<a ...
- Ruby JSON操作
解析来我们就可以使用以下命令来安装Ruby JSON 模块: ? 1 $gem install json 使用 Ruby 解析 JSON 以下为JSON数据,将该数据存储在 input.json ...
- mysql 创建用户与授权
权限管理 我们都知道,最高权限管理者是 root 用户 , 它拥有着最高的权限操作,包括 : select(查询) ,update(修改) , delete(删除,有事没事都不要用这个,反正也不能给这 ...
- 51Nod 1486 大大走格子 —— 组合数学
题目链接:https://vjudge.net/problem/51Nod-1486 1486 大大走格子 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: ...
- 使用libcurl,根据url下载对应html页面
1. [图片] Capture.JPG 2. [代码]GetPageByURL //static member variable definestring GetPageByURL::m_curPa ...
- jQuery Validate 插件为表单提供了强大的验证功能
之前项目开发中,表单校验用的jQuery Validate 插件,这个插件为表单提供了强大的验证功能,让客户端表单验证变得更简单,同时提供了大量的定制选项,满足应用程序各种需求.该插件捆绑了一套有用的 ...
- JS工具函数汇总
备注:http://phpjs.org/ 这个站点把PHP常用的方法用js实现了,推荐一下 1.从数组中随机获取几个不重复项 //从一个给定的数组arr中,随机返回num个不重复项 function ...
- linkedhashSet和hashSet和TreeSet的区别(转)
Set接口Set不允许包含相同的元素,如果试图把两个相同元素加入同一个集合中,add方法返回false.Set判断两个对象相同不是使用==运算符,而是根据equals方法.也就是说,只要两个对象用eq ...
- C/C++语法知识点汇总
* 静态局部变量,在不同函数中可以同名. 静态全局变量,在不同文件中可以同名. 静态函数,在不同文件中可以同名. * 普通全局变量和普通函数,在同一工程中不能同名. 在相链接的程序与库之间,可以同 ...
- ACM学习历程—HDU 2112 HDU Today(map && spfa && 优先队列)
Description 经过锦囊相助,海东集团终于度过了危机,从此,HDU的发展就一直顺风顺水,到了2050年,集团已经相当规模了,据说进入了钱江肉丝经济开发区500强.这时候,XHD夫妇也退居了二线 ...