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++增加引用就是避免使用指針,減少代碼難度,增加更嚴格的标準。
缺點: 在傳回值為引用時容易因為局部變量被釋放而出錯。
值拷貝時優點: 函數的副作用,安全性好 缺點:傳參效率低,不能改變實參
位址傳遞拷貝時:傳參效率高,形參可以改變值
缺點: 不安全,容易導緻意外改變實參值