【LeetCode & 劍指offer刷題】字符串題5:58 翻轉字符串(翻轉單詞與左旋轉字符串)
阿新 • • 發佈:2019-01-05
輸出 swap 語言 翻轉 amp 劍指offer abc adding 倒數
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 刷題筆記】目錄(持續更新中...)
58 翻轉字符串
題目一:翻轉單詞順序
牛客最近來了一個新員工Fish,每天早晨總是會拿著一本英文雜誌,寫些句子在本子上。同事Cat對Fish寫的內容頗感興趣,有一天他向Fish借來翻看,但卻讀不懂它的意思。例如,“student. a am I”。後來才意識到,這家夥原來把句子單詞的順序翻轉了,正確的句子應該是“I am a student.”。Cat對一一的翻轉這些單詞順序可不在行,你能幫助他麽? //方法一:一個字符一個字符的處理,得到單詞之後插入到結果字符串前面 #include <algorithm>} 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 翻轉字符串(翻轉單詞與左旋轉字符串)