收集了一些C/C++面试题,贴出来分享,有几道题的程序是网友写的,在程序中有说明。 欢迎转发,转发请注明出处,谢谢合作。 //题目1:求1+2+…+n, //要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)。 //方法一:常规方法:不满足要求 //使用递归需要一个终止条件... /* #include <iostream> using namespace std; int sum(int ival) { if(ival > 0) return sum(ival-1) + ival; return 0; } void main() { int i = 100; cout<<sum(i)<<endl; } */ /* //方法二: //首先想到的应该是:这个问题在数学上是怎么解决的,寻找数学上的解决方法,然后再是计算机语言中的技术... //等差数列求和公式:Sn = (a1 + an)*n/2 或 Sn = n*a1 + n(n-1)*d/2 #include <iostream> using namespace std; int sum(int ival) { if(ival > 0) return ((long)1 + ival)*ival/2 ; return 0; } void main() { int i = 100; cout<<sum(i)<<endl; } */ /* //方法三:代码是网友提供的! //思路:模板元编程,最快捷的计算方式,编译期完成计算 #include <iostream> using namespace std; template<int N> struct CalCls { enum {sum = CalCls<N-1>::sum + N}; }; template<> struct CalCls<0> { enum {sum = 0}; }; int main() { cout<<"1+2+3+...+100 = "<<CalCls<100>::sum<<endl; return 0; } */ /* //题目2:求子数组的最大和 //输入一个整形数组,数组里有正数也有负数。 //数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 //求所有子数组的和的最大值。要求时间复杂度为O(n)。 //例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2, //因此输出为该子数组的和18。 //如果要求输出最大的子数组,则要一个计数器和一个记录下表的索引 #include <iostream> using namespace std; int maxSum(int* a, int n) { int sum=0; //sum记录所有数组之和中的最大值 int b=0; //b记录当前连续数组之和 for(int i=0; i<n; i++) { if(b<0) b=a[i]; //如果a[i]前面的所有数之和为负数,则从a[i]开始求b else b+=a[i]; if(sum<b) sum=b; } return sum; } int main() { // int a[10]={1,-8,6,3,-1,5,7,-2,0,1}; int a[8]={1,-2,3,10,-4,7,2,-5}; cout<<maxSum(a,8)<<endl; return 0; } */ /* //题目3:跳台阶问题 //题目:一个台阶总共有n级,如果一次可以跳1级,也可以跳2级。 //求总共有多少总跳法,并分析算法的时间复杂度。 //这道题最近经常出现,包括MicroStrategy等比较重视算法的公司都 //曾先后选用过个这道题作为面试题或者笔试题 //思路:算法问题要想到数学中解决问题的方法 // 设1级跳了x次,2级跳了y次,这有方程:x + 2*y = n ,所有在这条直线上的非负整数x和y都满足条件 //以下实现方法复杂度为O(n^2),求更低复杂度的方法... #include <iostream> using namespace std; void main() { int count = 0; int n; cout<<"please enter the number n: "; cin>>n; for(int x=0;x<=n;++x) //复杂度O(n^2) for(int y=0;y<=n;++y) if(x+2*y == n) ++count; cout<<"count = "<<count<<endl; } */ /* //题目4:写一个函数,它的原形是int continumax(char *outputstr,char *intputstr) //功能: //在字符串中找出连续最长的数字串,并把这个串的长度返回, //并把这个最长数字串付给其中一个函数参数outputstr所指内存。 //例如:"abcd12345ed125ss123456789"的首地址传给intputstr后,函数将返回9, //outputstr所指的值为123456789 #include <iostream> using namespace std; int continumax(char *outputstr,char *intputstr) { int count(0),maxlen(0),templen(0); //count计数当前连续数字的个数,maxlen记录最大连续数字的个数、 //templen记录当前连续数字的个数。 char *temp; while(*intputstr != '/0') { if(*intputstr >='0' && *intputstr <='9') ++count; else { temp = intputstr-count; templen = count; count = 0; } if(*(intputstr+1) =='/0') { temp = intputstr-count+1; templen = count; } if(maxlen < templen) { outputstr = temp; maxlen = templen; } ++intputstr; } cout<<"continumax is : "; for(int id=0;id<maxlen;++id) cout<<*(outputstr++); //注意:即使outputstr是指针,main()也不能调用, //因为:形参在函数调用时创建,在函数执行完毕时撤销。 cout<<endl; cout<<"maxlen = "<<maxlen<<endl; return maxlen; } //char *outputstr = 0; void main() { char a[] = "abcd12345ed125ss123456789"; char *intputstr = a; char *outputstr = 0; int maxlen = continumax(outputstr,intputstr); } */ //题目5:从屏幕上接受一串字符串,然后倒序输出这个字符 //这个题目主要容易出错的地方: 在命令行中不同的输入方法对空白的处理 //方法一:使用string类型或者数组或者char* /* #include<iostream> #include<string> using namespace std; void main() { string str; cout<<"please input a string: "<<endl; // cin>>str; //容易出现的问题:>>操作符读取时忽略输入字符串中的所有空白字符!!! getline(cin,str); //容易犯的错误:string对象默认在其末尾加上null,所以要从str.size()-1开始输出... for(int sz= str.size()-1;sz>-1;sz--) cout<<str[sz]; } */ /* //方法二:使用vector的reverse_iterator #include<iostream> #include<vector> using namespace std; void main() { char ch; cout<<"please input a string: "; vector<char> cvec; // while(cin>>ch) //使用这种方法,输入的字符串中的空格不能显示 while((ch=getchar()) != '/n') cvec.push_back(ch); for(vector<char>::reverse_iterator it = cvec.rbegin(); it != cvec.rend(); ++it) cout<<*it; } */ //题目6:请写一个C函数,如果处理器是big-endian,则返回0;如果是litter-endian,则返回1; //"Little Endian" means that the low-order byte of the number is stored in memory at the lowest address, // and the high-order byte at the highest address //"Big Endian" means that the high-order byte of the number is stored in memory at the lowest address, //and the low-order byte at the highest address /* //方法一: #include<iostream> using namespace std; int checkCPU() { // union的存放顺序是:所有成员从低地址开始存放 / ?????????????????????????????????????????????????? union{ int a; char b; } u; u.a = 1; return( u.b == 1 ); } void main() { if(checkCPU()) cout<<"my CPU is litter-endian"<<endl; else cout<<"my CPU is big-endian"<<endl; } */ //方法二 方法二比较好理解 /* #include<iostream> using namespace std; bool IsBigendian() { unsigned short usData = 0x1122; unsigned char *pucData = (unsigned char*)&usData; return (*pucData == 0x22); } void main() { if(IsBigendian()) cout<<"my CPU is litter-endian"<<endl; else cout<<"my CPU is big-endian"<<endl; } */ /* //题目7: //在不用第三方参数的情况下,交换两个参数的值 #include<iostream> using namespace std; void main() { int i=10,j=100; i^=j; j^=i; i^=j; cout<<"i = "<<i<<endl; cout<<"j = "<<j<<endl; } */