1. 程式人生 > >【LeetCode & 劍指offer刷題】字符串題5:58 翻轉字符串(翻轉單詞與左旋轉字符串)

【LeetCode & 劍指offer刷題】字符串題5:58 翻轉字符串(翻轉單詞與左旋轉字符串)

輸出 swap 語言 翻轉 amp 劍指offer abc adding 倒數

【LeetCode & 劍指offer 刷題筆記】目錄(持續更新中...)

58 翻轉字符串

題目一:翻轉單詞順序

牛客最近來了一個新員工Fish,每天早晨總是會拿著一本英文雜誌,寫些句子在本子上。同事Cat對Fish寫的內容頗感興趣,有一天他向Fish借來翻看,但卻讀不懂它的意思。例如,“student. a am I”。後來才意識到,這家夥原來把句子單詞的順序翻轉了,正確的句子應該是“I am a student.”。Cat對一一的翻轉這些單詞順序可不在行,你能幫助他麽? //方法一:一個字符一個字符的處理,得到單詞之後插入到結果字符串前面 #include <algorithm>
class Solution { public: string ReverseSentence(string str) { string result,temp; for(char ch:str) //一個字符一個字符的處理 { if(ch == ‘ ‘) { result = ‘ ‘ + temp + result;//將每個單詞放到前面(如果把這個看做數組,就是把temp插入到前面) temp = ""; //置空
} else temp += ch; //構建單詞 } if(temp.size()) result = temp + result; //補充最後一個單詞到最前面 return result; } }; /* 方法二:先整體翻轉,再翻轉單詞內部 鏈接:https://www.nowcoder.com/questionTerminal/3194a4f4cf814f63919d0790578d51f3 來源:牛客網 */ //翻轉str從s到e的部分 void ReverseWord
(string &str, int s, int e) { while(s < e) swap(str[s++], str[e--]); } string ReverseSentence(string str) { ReverseWord(str, 0, str.size() - 1); //先整體翻轉 int left = 0, right = 0; int i = 0; while(i < str.size()) { while(i < str.size() && str[i] == ‘ ‘) //空格跳過 i++; left = right = i; //記錄單詞的第一個字符的位置 while(i < str.size() && str[i] != ‘ ‘) //不是空格 找單詞最後一個字符的位置 { right++; } ReverseWord(str, left, right - 1); //局部翻轉 i = right;
} return str; } 題目二:左旋轉字符串 匯編語言中有一種移位指令叫做循環左移(ROL),現在有個簡單的任務,就是用字符串模擬這個指令的運算結果。對於一個給定的字符序列S,請你把其循環左移K位後的序列輸出。例如,字符序列S=”abcXYZdef”,要求輸出循環左移3位後的結果,即“XYZdefabc”。是不是很簡單?OK,搞定它! 相關題目:右旋數組 class Solution { public: string LeftRotateString(string str, int n) { if(n < 1 || str.empty()) return str; n = n%str.size(); //防止n過大 reverse(str.begin(), str.end()); reverse(str.begin(), str.end() - n); reverse(str.end() - n, str.end()); return str; //循環左移n位可以先反轉整個序列,然後反轉倒數n個元素,再翻轉前面元素 } };

【LeetCode & 劍指offer刷題】字符串題5:58 翻轉字符串(翻轉單詞與左旋轉字符串)