天天看點

C/C++2019秋招面試題集合01

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++增加引用就是避免使用指針,減少代碼難度,增加更嚴格的标準。

缺點: 在傳回值為引用時容易因為局部變量被釋放而出錯。

值拷貝時優點: 函數的副作用,安全性好 缺點:傳參效率低,不能改變實參

位址傳遞拷貝時:傳參效率高,形參可以改變值

缺點: 不安全,容易導緻意外改變實參值

繼續閱讀