輸入乙個英文句子,翻轉句子中單詞的順序,但單詞內字元的順序不變。為簡單起見,標點符號和普通字母一樣處理。例如輸入字串"i am a student. 「,則輸出"student. a am i」。
示例 1:
輸入: "the sky is blue"
輸出: "blue is sky the"
示例 2:
輸入: " hello world! "
輸出: "world! hello"
解釋: 輸入字串可以在前面或者後面包含多餘的空格,但是反轉後的字元不能包括。
示例 3:
輸入: "a good example"
輸出: "example good a"
解釋: 如果兩個單詞間有多餘的空格,將反轉後單詞間的空格減少到只含乙個。
說明:
方法一:雙指標
複雜度分析:
**實現:
class
solution
int j = len -1;
string res ="";
while
(j >=0)
while
(j >=
0&& s[j]
!=' '
)int pos = j;
// 用 pos 儲存 j 當前的位置
j++;// j 現在指向的是乙個空格,需要右移一位才能指向乙個單詞的開頭
while
(s[j]
!=' '
&& j < len)
j = pos;
// j 回到新新增的單詞的最左端再往左乙個空格處
res +
=' '
;// 單詞新增完畢後需要加上乙個空格}if
(res.
length()
>0)
return res;}}
;
方法二:單詞逐個反轉、再整體反轉
我們首先去除 s 首尾的空格。然後翻轉整個 s。比如 s = " hi grosec ",會變成 s = 「cesorg ih」。
然後我們再通過 i 和 j 來定位 s 中每個單詞的首尾(左閉右閉),然後依次翻轉每個單詞。比如上面的 s = 「cesorg ih」,我們將會依次翻轉 「cesorg」 和 「ih」,從而最終得到 s = 「grosec hi」。
在上面這個過程中,處理完乙個單詞之後,j 會右移,這期間會判斷是否存在多個空格,如果是,則會迴圈 erase 多餘的空格。
複雜度分析:
**實現:
class
solution
if(i == s.
size()
)break
;int j = i;
while
(j < s.
size()
&& s[j]
!=' '
)++j;
//遍歷1個非空單詞
reverse
(s.begin()
+ i, s.
begin()
+ j)
;//反轉1個單詞
if(k) s[k++]=
' ';
while
(i < j) s[k++
]= s[i++];
//反轉後的1個單詞賦給s[k]
} s.
erase
(s.begin()
+ k, s.
end())
;//刪除 k後面空格
reverse
(s.begin()
, s.
end())
;return s;}}
;
劍指Offer 翻轉單詞順序
題目描述 牛客最近來了乙個新員工fish,每天早晨總是會拿著一本英文雜誌,寫些句子在本子上。同事cat對fish寫的內容頗感興趣,有一天他向fish借來翻看,但卻讀不懂它的意思。例如,student.a am i 後來才意識到,這傢伙原來把句子單詞的順序翻轉了,正確的句子應該是 i am a stu...
劍指offer 翻轉單詞順序
輸入乙個英文句子,翻轉句子中單詞的順序,但單詞內字元的順序不變。為簡單起見,標點符號和普通字母一樣處理。例如輸入字串 i am a student.則輸出 student.a am i 示例 1 輸入 the sky is blue 輸出 blue is sky the 示例 2 輸入 hello ...
劍指Offer之翻轉單詞順序
題目描述 jobdu最近來了乙個新員工fish,每天早晨總是會拿著一本英文雜誌,寫些句子在本子上。同事cat對fish寫的內容頗感興趣,有一天他向fish借來翻看,但卻讀不懂它的意思。例如,student.a am i 後來才意識到,這傢伙原來把句子單詞的順序翻轉了,正確的句子應該是 i am a ...