C/C++校招笔试面试经典题目总结六
2015-07-22 16:33
211 查看
题目51:写一个函数找出一个整数数组中,第二大的数(microsoft)
解析:const int MINNUMBER = -32767 ; int find_sec_max( int data[] , int count) { int maxnumber = data[0] ; int sec_max = MINNUMBER ; for ( int i = 1 ; i < count ; i++) { if ( data[i] > maxnumber ) { sec_max = maxnumber ; maxnumber = data[i] ; } else { if ( data[i] > sec_max ) sec_max = data[i] ; } } return sec_max ; }
题目52:输入一个字符串,将其逆序后输出
解析:第一种:
#include <iostream> using namespace std; void main() { char a[50];memset(a,0,sizeof(a)); int i=0,j; char t; cin.getline(a,50,'\n'); for(i=0,j=strlen(a)-1;i<strlen(a)/2;i++,j--) { t=a[i]; a[i]=a[j]; a[j]=t; } cout<<a<<endl; }第二种:
string str; cin>>str; str.replace; cout<<str;
题目53:下列表达式正确的是:
A:9++B:(x+y)++
C:c+++c+++c++
D:++(a-b--)
解析:C。9是一个常量,常量不能自增自减,而( x+y )和下面的( a -b )都是作为一种只读内存区存在的,所以都不能进行自增自减操作。
题目54:编程实现:找出两个字符串中最大公共子字符串,如"abccade","dgcadde"的最大子串为"cad"
解析:int GetCommon(char *s1, char *s2, char **r1, char **r2) { int len1 = strlen(s1); int len2 = strlen(s2); int maxlen = 0; for(int i = 0; i < len1; i++) { for(int j = 0; j < len2; j++) { if(s1[i] == s2[j]) { int as = i, bs = j, count = 1; while(as + 1 < len1 && bs + 1 < len2 && s1[++as] == s2[++bs]) count++; if(count > maxlen) { maxlen = count; *r1 = s1 + i; *r2 = s2 + j; } } } }
题目55:test.c文件中包括如下语句,文件中定义的四个变量,哪个变量不是指针类型?
#define INT_PTR int* typedef int*int_ptr; INT_PTR a,b; int_ptr c,d;A:a B:b C:c D:d E:都是指针 F:都不是指针
解析:B 注意define与typedef的区别。前者只是简单的替换,替换后是int* a,b,b是int类型;typedef不是简单替换 ,而是采用如同定义变量的方法那样来声明一种类型,c,d都是指针类型。
题目56:针对以下代码,判断下列说法哪个是正确的()
const char str1[] = "abc"; const char str2[] = "abc"; const char *p1 = "abc"; const char *p2 = "abc";A:str1和str2地址不同,P1和P2地址相同
B:str1和str2地址相同,P1和P2地址相同
C:str1和str2地址不同,P1和P2地址不同
D:str1和str2地址相同,P1和P2地址不同
E:4个地址都相同
F:4个地址都不同
解析:选A。str1和str2是栈空间中的两个字符数组,地址不同
p1和p2指向的位置在常量区,值都是“abc”所以是同一常量,地址相同
题目57:下列 C 代码中,不属于未定义行为的有___
A:Int i=0;i=(i++);B:char *p=”hello”;p[1]=’E’;
C:char *p=”hello”;char ch=*p++;
D:int i=0;printf(“%d%d\n”,i++,i--);
E:都是未定义行为
F:都不是未定义行为
解析:C A,D:表达式的先后顺序,是由编译器决定的,有可能不同
B:常量字符串不能修改,指针改为数组可以。
题目58:程序出错在什么阶段__?
int main(void) { http://www.taobao.com cout << "welcome to taobao" << endl; }A:预处理阶段出错
B:编译阶段出错
C:汇编阶段出错
D:链接阶段出错
E:运行阶段出错
F:程序运行正常
解析:F。双斜杠之后的www.csdn.net被当做注释了,那么前面的http:是否合法?这就是C++中一个几乎不会被用到的语法,标签。带标签的语句是一种特殊的语句,在语句前面有一个标识符(即标签,上段代码中的http)和一个冒号。使用goto label就可以跳到标签处执行,比如可以在代码中写goto
http,这样就会执行cout语句了。
题目59:给出以下定义,下列哪些操作是合法的?
char a[] = "hello"; char b[] = "world"; const char *p1 = a; char* const p2 = b;A:p1++
B:p1[2]='w';
C:p2[2]='l';
D:p2++
解析:A,C。p1是指向常量的指针,所指向的内容不能变,所以改变p1指向的值是不对的。
p2是一个指针常量,它本身的指向不能改变,所以对p2的下标操作是不对的。
题目60: 字符串比较的KMP算法
KMP具体的思想就是利用有限自动机来快速匹配,利用O(m)的空间来存储pattern内pattern从左开始的所有连续子串的自我覆盖程度。存储的-1表示没有任何覆盖,存储的0,表示有一个匹配。然后利用建立好的这个覆盖程序数组,在KMP算法中进行字符串匹配失败的时候,可以根据这个值来觉得待比较的位置前进的个数,而不是跟朴素的算法一样是一个一个前进的。代码实现:
void Next(char str[], int len) { next[0]=-1; for(int i=1;i<len;i++) { if(next[i-1]==-1&&str[i]==str[0]) next[i]=0; else if(next[i-1]>=0&&str[next[i-1]+1]==str[i]) next[i]=next[i-1]+1; else next[i]=-1; } } int KMP(char source[],int lenS,char pattern[],int lenP) { int source_index=0; int pattern_index=0; Next(pattern,lenP); while(source_index<lenS && pattern_index<lenP) { if(source[source_index]==pattern[pattern_index]) { ++source_index; ++pattern_index; } else { if(pattern_index==0) source_index++; else pattern_index = next[pattern_index-1]+1; } } if(pattern_index == lenP) return source_index-lenP; else return -1; }明天努力更新!
相关文章推荐
- c语言,内存字节对齐
- 深入C++之对象构造析构
- C++ STL之map
- VC++中的类的内存分布(上)
- C++矩阵库 Eigen 快速入门
- C++函数间数据传递方式
- C++函数间数据传递方式
- C++版修真小说
- C语言,const
- C++ md5类,封装好
- C++ o matching function for call to 'transform...错误
- C语言,题目:函数调用,内存,malloc找错
- 【C++】多态性(函数重载与虚函数)
- c语言,数组和字符串
- 使用make是深入进行c++开发的必然选择
- 设定C和C++ CodeBlocks编译器的初学者教学指南
- C++类型转换运算符 static_cast,dynamic_cast,reinterpret_cast,const_cast
- C语言inline函数
- C语言的inline
- [C++设计模式] composite 组合模式