C/C++2019秋招面试题集合01
8.19【腾讯】提前批 - 客户端开发
1 给定一个字符串数组,和一个子串,求字符串中是否存在子串,如果存在则返回首个匹配到的索引位置,否则,返回 −1。不能调用库函数。
例如:
字符串数组:Integrity Procative Collaboration Innovation
子串:tegri
返回:2
int IndexOfSubstr(const char* const raw_str, const char* const sub_str) {}
/*
找子串步骤: 1 首个for循环为m-n+1次比较
2 内层循环for找到相同首字符就进行后续判断 否则跳出进行下次寻找
3 比较n与j 相等说明找到 返回子串首地址
*/
int IndexOfSubstr(const char* str1,const char* str2){
//只要有一个为空就没必要找
if(str1==NULL || str2==NULL){
return -1;
}
#if 0
//不调用库函数求字符串长度的写法
int m=0;
while(*str1!=0){
str1++;
m++:
}
#endif
//如果子串比数组大也没必要找
int m=strlen(str1);
int n=strlen(str2);
if(m<n){
return -1;
}
//开始寻找
for(int i=0;i<=m-n;i++){ //m-n的意思是至少比较到字符串1拥有与2相等的长度 所以要取等号
int j=0;
for(;j<n;j++){
if(str1[i+j]!=str2[j]){ //找到第一个相同的字母 就利用j进行两者后面的比较
break; //没找到就跳出 继续寻找第一个相同的字符
}
}
if(j==n){ //如果j等于n 说明j找到并循环到最后
return i; //返回第一个相同的字符地址
}
}
return -1; //没找到返回-1
}
2 函数传值的方式?
答:1值传递 2指针传递 3引用传递
区别是:1只是简单的值拷贝传递 2传递的是地址 3形参就是本身实参
3 引用和拷贝的区别?
答:引用:1定义时必须初始化 2不能赋值为NULL 3引用确定关系不能再引用别的对象,但可定义引用的引用
例: int b=1;int &a=b;
int c=2; int &a=c;//error
int &d=a; //ok
拷贝是简单的值拷贝或者地址拷贝,若值传递形参值的改变或者地址传递过去后,指针指向改变,并不会影响到实参。而引用则会,因为就是其本身。
4 引用的优缺点和拷贝的优缺点
引用优点:C++增加引用就是避免使用指针,减少代码难度,增加更严格的标准。
缺点: 在返回值为引用时容易因为局部变量被释放而出错。
值拷贝时优点: 函数的副作用,安全性好 缺点:传参效率低,不能改变实参
地址传递拷贝时:传参效率高,形参可以改变值
缺点: 不安全,容易导致意外改变实参值