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

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

【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個元素,再翻轉前面元素     } };