劍指offer 面試題42:左旋轉字串vs翻轉單詞順序 c++
阿新 • • 發佈:2018-11-23
題目:組合語言中有一種移位指令叫做迴圈左移(ROL),現在有個簡單的任務,就是用字串模擬這個指令的運算結果。對於一個給定的字元序列S,請你把其迴圈左移K位後的序列輸出。例如,字元序列S=”abcXYZdef”,要求輸出迴圈左移3位後的結果,即“XYZdefabc”。是不是很簡單?OK,搞定它!
思路:通過旋轉, 比如題目中S=”abcXYZdef”,第一次全部旋轉S="fedZYXcba",第二次 旋轉0至length-3為S="XYZdefcba",第三次旋轉length-2至length為S="XYZdefabc"
class Solution { public: void reverse(string &str,int a,int b) { char c; while(a<=b) { c=str[a]; str[a]=str[b]; str[b]=c; a++,b--; } } string LeftRotateString(string str, int n) { if(str.empty() || n==0) return str; int len=str.length()-1; reverse(str,0,len); reverse(str,0,len-n); reverse(str,len-n+1,len); return str; } };
題目:(翻轉單詞順序列)牛客最近來了一個新員工Fish,每天早晨總是會拿著一本英文雜誌,寫些句子在本子上。同事Cat對Fish寫的內容頗感興趣,有一天他向Fish借來翻看,但卻讀不懂它的意思。例如,“student. a am I”。後來才意識到,這傢伙原來把句子單詞的順序翻轉了,正確的句子應該是“I am a student.”。Cat對一一的翻轉這些單詞順序可不在行,你能幫助他麼?
思路:還是基於 翻轉,先全部翻轉一次,然後碰到空格即為每個單詞,翻轉一次。可以自己寫函式,也可以用stl的reverse函式
class Solution { public: void reverse(string &str,int a,int b) { char c; while(a<=b) { c=str[a]; str[a]=str[b]; str[b]=c; a++,b--; } } string ReverseSentence(string str) { if(str.empty())return str; int start=0,len=str.length()-1; reverse(str,start,len); for(int i=0;i<=len;++i) { if(str[i]==' ') { reverse(str,start,i-1); start=i+1; } if(i==len) reverse(str,start,len); } return str; } };
用stl的reverse函式
string ReverseSentence(string str) { int size = str.size(); reverse(str.begin(), str.end()); // 注意:翻轉後的第一個字元是空格 int start = 0; for (int i = 0; i < size; ++i) { if (str[i] == ' ') { reverse(str.begin() + start, str.begin() + i); start = i + 1; // 每個單詞的第一個下標 } if (i == size - 1) // 翻轉最後一個單詞 reverse(str.begin() + start, str.end()); } return str; }