日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

字符串笔面试题

發(fā)布時間:2024/1/17 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 字符串笔面试题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、把一個字符串向左/右循環(huán)移位n個。如abcdefghi,向左循環(huán)移位2個,結(jié)果為cdefghiab。

? ? 這題的出現(xiàn)概率較大,難度較小

1)如果沒有空間的限制,那么第一個容易想到的解法是,申請一個strlen長的字符串數(shù)組,把字符串復(fù)制到這一數(shù)組,然后依照移位前后數(shù)組序號的關(guān)系,確定移位后的字符串。移位后的數(shù)字序號是未移位+n(移位距離),循環(huán)所以要%strlen

char* rLeftfour(char * str,int n) {int slen=strlen(str);n%=slen; //循環(huán)左移位//n=slen-n%slen; //循環(huán)右移位char *temp=new char[slen];for (int i=0;i<slen;i++)temp[i]=str[i];for (int j=0;j<slen;j++)str[j]=temp[(j+n)%slen];return str; }

?

2)假設(shè)只能申請一個字節(jié)的額外空間,時間沒有限制。那么可以對上述算法改進,每次只循環(huán)移動一位,總共循環(huán)n次。循環(huán)一位的時候,只需要保存第一個字符就行,后面的字符依次復(fù)制上來,然后把第一個字符復(fù)制到最后。

char* rLefttwo(char * str,int n) {int slen=strlen(str);n%=slen; //循環(huán)左移位//n=slen-n%slen; //循環(huán)右移位for (int i=0;i<n;i++){ char temp=str[0];for (int j=0;j<slen-1;j++)str[j]=str[j+1];str[slen-1]=temp; }return str; }

?

3)在1)中申請空間可以縮小,只要保存移位的前n個字符即可,把后面依次復(fù)制到前面,最后把保存的字符復(fù)制到最后,

char* rLeftone(char * str,int n) {int slen=strlen(str);n%=slen; //循環(huán)左移位,等于數(shù)組長時相當于沒有移位//n=slen-n%slen; //循環(huán)右移位char *temp=new char[n];for (int i=0;i<n;i++)temp[i]=str[i];for (int j=n;j<slen;j++)str[j-n]=str[j];for (int k=0;k<n;k++)str[slen-n+k]=temp[k];return str; }

?

4)來自于編程珠璣,思想是把原始字符串分成ab兩部分,a是前i個元素,b是后n-i個元素,首先對a逆序,得到a-1b,然后對b逆序得到a-1b-1,然后對整體逆序得到(a-1b-1-1=ba。

char* rLeftthree(char * str,int n) {int slen=strlen(str);n%=slen; //循環(huán)左移位//n=slen-n%slen; //循環(huán)右移位reverse(str,0,n-1);reverse(str,n,slen-1);reverse(str,0,slen-1);return str; } char* rLeftfour(char * str,int n) {int slen=strlen(str);n%=slen; //循環(huán)左移位//n=slen-n%slen; //循環(huán)右移位char *temp=new char[slen];for (int i=0;i<slen;i++)temp[i]=str[i];for (int j=0;j<slen;j++)str[j]=temp[(j+n)%slen];return str; }

二、翻轉(zhuǎn)字符串的詞。如“the sky is blue”,翻轉(zhuǎn)后為“blue is sky the”。要考慮字符串開頭和結(jié)尾可能有空格。

1)考慮額外的存儲空間,保存字符串的每個單詞于一個二維數(shù)組中,每行一個單詞,開頭結(jié)尾的空格也存儲,然后從數(shù)組的尾掃描到頭輸出即可。

#include <iostream> using namespace std; const int row=20; const int col=20; void reverse(char *&s) {char *ss=new char[row*col](); char **temp=new char *[row];//新建二維數(shù)組存儲字符串中單詞int j=0,k=0,m=0;for (int i=0;i<row;i++){temp[i]=new char[col]();}for (int i=0;s[i]!='\0';i++){temp[j][k]=s[i]; k++;if (s[i]==' ') //掃描字符串遇到空格,存到數(shù)組下一行,如果是開頭的空格也一樣處理,空間要求大 {j++;temp[j][k]='\0'; k=0;}}temp[j][k]=' ';//處理最后一個單詞k++;temp[j][k]='\0';for (int i=j;i>=0;i--){int k;for ( k=0;temp[i][k]!='\0';k++){if (temp[i][k]==' ') //遇到空格跳出break;else {ss[m]=temp[i][k];m++; }} if (k>0){ss[m]=' ';//不是開頭結(jié)尾的加空格m++;}}ss[m-1]='\0';cout<<ss<<endl; s=ss; } int main() {char *s=new char[row*col];s=" hello world! we are one ";reverse(s);cout<<s; }

? ?

?程序是將單詞加空格后存成字符串,先分配內(nèi)存后,掃描字符串,先存,不管是空格還是字符,若第二個是空格或者掃到空格的位置(因為是先存所以單詞后都有空格),就到二維數(shù)組的下一行,直到字符串處理完畢。接著從二維數(shù)組的尾行開始,輸出,若存的第一個是空格,忽略,然后把二維數(shù)組的單詞輸出到字符串中,每個單詞間加空格。

C++程序

#include <iostream> #include <string> using namespace std; void reverseWords(string &s) {string rs;for (int i = s.length()-1; i >= 0; ){while (i >= 0 && s[i] == ' ') i--;if (i < 0) break;if (!rs.empty()) rs.push_back(' ');string t;while (i >= 0 && s[i] != ' ') t.push_back(s[i--]);reverse(t.begin(), t.end());//t.push_back(' '); rs.append(t);}s = rs; }int main(){string s=" hello world! ";reverseWords(s);cout<<s;}

? ? ??

? ? ? 從后掃描,遇到空格則跳過,定義一個中間變量t來存單詞,到空格時,把存的字符串翻轉(zhuǎn),成!dlrow,加到rs末,跳過空格,加空格在單詞間。在最后一個單詞時,i<0.不會加空格。

2)利用字符串的翻轉(zhuǎn),先對整個字符串翻轉(zhuǎn),然后對字符串中的單詞翻轉(zhuǎn)。

#include <iostream> using namespace std; void Reverse(char *pBegin,char *pEnd) {if(pBegin == NULL || pEnd == NULL)return ; while(pBegin < pEnd) {char temp = *pBegin;*pBegin = *pEnd;*pEnd = temp;pBegin ++, pEnd --; } } char* ReverseSentence(char *pData) {if(pData == NULL)return NULL;char *pBegin = pData;char *pEnd = pData;while(*pEnd != '\0')pEnd ++;pEnd--;// Reverse the whole sentence Reverse(pBegin, pEnd);// Reverse every word in the sentencepBegin = pEnd = pData;while(*pBegin != '\0'){if(*pBegin == ' '){pBegin ++;pEnd ++;}else if(*pEnd == ' ' || *pEnd == '\0'){Reverse(pBegin, --pEnd);pBegin = ++pEnd;}else {pEnd ++;}}return pData; } int main() {char pstr[]=" hello world! ";cout<<ReverseSentence(pstr); }

? ? ?翻轉(zhuǎn)整個字符串比較好理解,翻轉(zhuǎn)詞時,是定義了兩個指針,一個指向詞頭,開始若是空格,兩指針一起走,當不是空格時,end的指針向前走,走到空格后者尾時,翻轉(zhuǎn)begin到end間字符,翻轉(zhuǎn)后,要把begin指針移動到end位置,然后一起走,重復(fù)。類似上面,其實這題主要的難點在怎么處理那些頭和尾的空格。上述代碼沒有處理空格。想處理空格應(yīng)該也不難,在翻轉(zhuǎn)后保存詞,并加空格

轉(zhuǎn)載于:https://www.cnblogs.com/dawnminghuang/p/3942695.html

總結(jié)

以上是生活随笔為你收集整理的字符串笔面试题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。