继续把自己做的一些比较经典的面试题贴出来,题目均在VS2008中调试通过,欢迎交流,欢迎转发,转发请注明出处,谢谢。 /* //题目1:查找最小的k个元素 //题目:输入n个整数,输出其中最小的k个。 //例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。 #include<iostream> using namespace std; void print_min_k(int *pta,int n,int k) { //采用冒泡排序,到第k次即可结束排序,输出已排序的k个数即为求 int temp(0); for(int i=0;i<k;++i) for(int j=0;j<n-1;++j) if( *(pta+j) > *(pta+j+1) ) { temp = *(pta+j); *(pta+j) = *(pta+j+1); *(pta+j+1) = temp; } for(int i=0;i<k;++i) cout<<*(pta+i)<<","; } void main() { int a[10] = {0,5,2,32,58,95,14,2,6,5}; int *pta = a; print_min_k(pta,10,5); } */ //题目2:打印"杨辉三角". /* #include<iostream> using namespace std; void main() { int dimension(0); cout<<"please enter the dimension: "; cin>>dimension; //动态创建一个10*10二维数组, //好处是:动态数组的维数可以由用户输入的dimension改变,而非动态数组的维数只能设定一次 int **a; int xdim = dimension; int ydim = dimension; a= new int *[xdim]; for(int ix=0;ix<xdim;++ix) a[ix] = new int[ydim]; //打印"杨辉三角" a[0][0] = 1; cout<<"1"<<endl; for(int j=1;j!=dimension;++j) { a[j][0] = 1; cout<<a[j][0]<<" "; for(int i=1;i<j;++i) { a[j][i] = a[j-1][i-1] + a[j-1][i]; cout<<a[j][i]<<" "; } a[j][j] = 1; cout<<a[j][j]<<endl; } //释放动态数组 for(int ix=0;ix<xdim;++ix) delete [] a[ix]; delete [] a; } */ /* //题目3:任意数制之间的转换(二进制,四进制,八进制,十进制,十六进制) //不包含小数,如11100.011,没有输入类型检查函数。 //算法:以十进制为桥梁;任意进制->十进制->任意进制 #include<iostream> #include<string> using namespace std; int ToDecimal(string data,int DT) //将任意进制转化为十进制,DT为进制类型 { int sum = 0; for(size_t ix=0;ix<data.size();++ix) { if('1' == data[ix]) { int temp = 1; for(size_t index=0;index<data.size()-ix-1;++index) temp *=DT; sum +=temp; } } return sum; } string DecimalToAny(int integer,int DT) //将十进制转换成任意进制 { string s(""); int quotient = integer/DT; int residual = integer%DT; if(residual<10) // s = static_cast<char>(residual+'0') + s; //把int转换成char,然后插入到s前面 s = static_cast<char>(residual+48) + s; //把int转换成char,然后插入到s前面 else s = static_cast<char>(residual+55) + s; //如果是十六进制,就要出来余数为10到16的情况。 while(quotient >= 1) { residual = quotient % DT; quotient /= DT; if(residual<10) s = static_cast<char>(residual+48) + s; //把ASCII码表把int转换成char,然后插入到s前面 else s = static_cast<char>(residual+55) + s; //如果是十六进制,就要出来余数为10到16的情况。 } return s; } string AnyToAny(string data,int source_DT,int det_DT) //将任意进制转换到任意进制 { int Decimal = ToDecimal(data,source_DT); string s = DecimalToAny(Decimal,det_DT); return s; } int main() //测试代码 { // string s = "1011"; // int Decimal = ToDecimal(s,2); // cout<<Decimal<<endl; // s = DecimalToAny(11,16); // cout<<s<<endl; string s("1101"); int a[5] = {2,4,8,10,16}; for(int ix=0;ix<5;++ix) { for(int jx=0;jx<5;++jx) { cout<<s<<" : "<<a[ix]<<" To "<<a[jx]<<" is "<<AnyToAny(s,a[ix],a[jx]); cout<<endl; } cout<<"************************************************"<<endl; } return 0; } */ /* //题目4:判断一个long类型正整数是否是2的n次方,(n>=0) //算法:将一个long类型的变量减1之后与自身相与,结果等于零则说明这个long类型的变量是2的n次方 //启发:通常逻辑操作符很难想到,但逻辑操作符会使一些问题变得特别简单!!!!!! #include<iostream> using namespace std; int main() { long n = 1023; if(n & n-1) cout<<n<<" is not the square of 2"<<endl; else cout<<n<<" is the square of 2"<<endl; return 0; } */ /* 题目5: 删除字符串中所有给定的子串 问题描述: 在给定字符串中查找所有特定子串并删除,如果没有找到相应子串,则不作任何操作。 要求实现函数: int delete_sub_str(const char *str, const char *sub_str, char *result_str) 注: I、 子串匹配只考虑最左匹配情况,即只需要从左到右进行字串匹配的情况。比如: 在字符串"abababab"中,采用最左匹配子串"aba",可以匹配2个"aba"字串。如果 匹配出从左到右位置2开始的"aba",则不是最左匹配,且只能匹配出1个"aba"字串。 II、 输入字符串不会超过100 Bytes,请不用考虑超长字符串的情况。 */ //算法:依次从源字符串中取出子字符串放在一个temp中,使用strcmp比较... //以下代码由网友piaojun_pj提供 #include <stdio.h> #include <string.h> #include <stdlib.h> //删除字串函数,在src中删除sub子串,并将结果保存在result字符串中 int delSubStr(char * src,char * sub,char * result) { char * src_p=src; char * sub_p=sub; char * res_p=result; int count=0;//记录包含子串的个数 int sub_len=strlen(sub);//记录子串的长度 char * temp;//临时保存子串的副本 temp=(char *)malloc(sub_len+1); memset(temp,'/0',sub_len+1); while(*src_p) { memcpy(temp,src_p,sub_len); //原串中包含与sub完全匹配的子串 if(!strcmp(temp,sub)) { count++; src_p+=sub_len; } else *res_p++=*src_p++; } *res_p='/0'; free(temp); return count;//返回包含子串的个数 } int main() { char result[100]; int count=delSubStr("abcdefgdehjtder","de",result); printf("The new string is:"); printf("%s/n",result); //以'/0'为结束标志 printf("count is:"); printf("%d/n",count); return 0; }