計算機筆試和面試最常考察的就是字符串的各種操作。字符串處理是我們程序員日常工作最常遇到的問題,能夠體現(xiàn)程序員的基本功。下面我就最近一個月以來的各種筆試和面試遇到的有關(guān)字符串處理的題目和大家分享一下:
1、google筆試:編碼實現(xiàn)求給定字符串(全為小寫英文字母)的最小后繼,如“abc”的最小后繼為
“abd”,“dhz”的最小后繼為“di”。
思路:題目比較簡單,對最后一個字符+1,如果大于’z’則對前一個字符+1,如果又是大于 ’z’
則重復之前步驟。所以寫代碼時,我們只要對字符串循環(huán)從后往前對每一個字符進行+1,直到
出現(xiàn)+1后不超過’z’為止。如果退出循環(huán)時第一個字符大于于’z’則提示不存在,否則
把退出循環(huán)的字符的后一位置為’\0’即可。
代碼:
1: int MinNextStr(const char* src,char* &minnext)
2: {
3: int srclen=strlen(src);
4: minnext=(char*)malloc((srclen+1)*sizeof(char));
5: if(minnext==NULL)
6: {
7: return -1;
8: }
9: strcpy(minnext,src);
10: int i=srclen-1;
11: while(i>=0)
12: {
13: minnext[i]++;
14: if(minnext[i]<='z')
15: {
16: break;
17: }
18: i--;
19: }
20: if(i<0)
21: {
22: return 0;
23: }
24: else
25: {
26: minnext[++i]='\0';
27: return 1;
28: }
29: }
如果把給定字符串全為小寫英文字母改為大小寫英文字母,則只要把
14: if(minnext[i]<='z') 改為 if(minnext[i]<='z'&&minnext[i]>'a'||minnext[i]<='Z')
注意minnext[i]<='z'&&minnext[i]>'a'是為了防止minnext[i]為大寫的情況,因為大寫英文字母(A:65)比小寫(a:97)的ASCII 碼小,如果不加minnext[i]>'a'則minnext[i]為(’Z’+1,ASCII 碼:91)也會跳出循環(huán)。
2、中興:編碼實現(xiàn)字符串右移n位,如“diopHeg”右移2位為“egdiopH”
思路1:只要把需要移動的最后n個字符保存下來,把前面剩下的全部后移n個位置,最后把開
始保存好的n 個字符填充到前面n個位置。注意:n超過字符串長度的情況,所以事
前先做n mod 字符串的長度。
代碼:
1: int RightMoveStr(char* src,int n)
2: {
3: int len=strlen(src);
4: int mov=n%len;
5: char* rstr=(char*)malloc((mov+1)*sizeof(char));
6: if(rstr==NULL)
7: {
8: return 0;
9: }
10: int i=0;
11: while(i<mov)
12: {
13: rstr[i]=src[len-mov+i];
14: i++;
15: }
16: rstr[i]='\0';
17: i=len-mov-1;
18: while(i>=0)
19: {
20: src[i+mov]=src[i];
21: i--;
22: }
23: i=0;
24: while(i<mov)
25: {
26: src[i]=rstr[i];
27: i++;
28: }
29: free(rstr);
30: return 1;
31: }
1: int RightMove(char* src,char* &ssrc,int n)
2: {
3: int len=strlen(src);
4: ssrc=(char*)malloc(sizeof(char)*(len+1));
5: n=n%len;
6: if(ssrc==NULL)
7: {
8: return 0;
9: }
10: int i=0;
11: char* s=src;
12: while(i<len-n)
13: {
14: s++;
15: i++;
16: }
17:
18: strcpy(ssrc,s);
19: *s='\0';
20: strcat(ssrc,src);
21: return 1;
22: }
3、新郵通:字符串反轉(zhuǎn):給定字符串“we;tonight;you;”,編碼實現(xiàn)輸出“ew;thginot;uoy;”
思路:使用兩個變量first和end分別記錄當前需要反轉(zhuǎn)的子串的頭和尾字符的下標,每遇到’;’就把first
和end之間的子串進行前后反轉(zhuǎn)。
代碼:
1: void ReverseStr(char *src)
2: {
3: int len=strlen(src);
4: int i=0;
5: int first=0;
6: int end=0;
7: while(i<len)
8: {
9: if(src[i]==';')
10: {
11: end=i-1;
12: while(first<end)
13: {
14: char temp=src[first];
15: src[first]=src[end];
16: src[end]=temp;
17: first++;
18: end--;
19: }
20: first=i+1;
21: }
22: i++;
23: }
24: }
如果給定字符串結(jié)尾沒有’;’,如“we;tonight;you”,編碼實現(xiàn)輸出“ew;thginot;uoy”
只需要修改一下代碼9、10、11行:
if(src[i]==';'||i==len-1){if(src[i]==';')end=i-1;elseend=i;
4、西艾:X86結(jié)構(gòu)下,下面代碼輸出結(jié)果是什么?
代碼:
1: char str[20]="Good night";
2: int* p=(int*)str;
3: p[0]=0x61626364;
4: p[1]=0x31323334;
5: p[2]=0x41424344;
6: cout<<str<<endl;
解題:考察知識點:
(1)int的內(nèi)存大?。?2bit=4byte;char的內(nèi)存大?。?bit=1byte;
(2)常用字符的ASCII 碼,’a’:97;’A’=65;’0’=48;
(3)十六進制轉(zhuǎn),0x61=97;
(4)大小端模式:
所謂的小端模式,是指數(shù)據(jù)的低位保存在內(nèi)存的低地址中,而數(shù)據(jù)的高位保存在內(nèi)存的高地址中,這種存儲模式將地址的高低和數(shù)據(jù)位權(quán)有效地結(jié)合起來,高地址部分權(quán)值高,低地址部分權(quán)值低,和我們的邏輯方法一致。
所謂的大端模式,是指數(shù)據(jù)的低位(就是權(quán)值較小的后面那幾位)保存在內(nèi)存的高地址中,而數(shù)據(jù)的高位,保存在內(nèi)存的低地址中,這樣的存儲模式有點兒類似于把數(shù)據(jù)當作字符串順序處理:地址由小向大增加,而數(shù)據(jù)從高位往低位放;
而X86結(jié)構(gòu)為小端模式,所以
p[0]=0x61626364;//97,98,99,100對應a,b,c,d,小端存在字符串str則為dcba
p[1]=0x31323334;//同理4321
p[2]=0x41424344;//同理DCBA
代碼輸出:dcba4321DCBA