給定乙個字串,逐個翻轉字串中的每個單詞。
說明:
無空格字元構成乙個單詞 。
輸入字串可以在前面或者後面包含多餘的空格,但是反轉後的字元不能包括。
如果兩個單詞間有多餘的空格,將反轉後單詞間的空格減少到只含乙個。
示例 1:
輸入:「the sky is blue」
輸出:「blue is sky the」
示例 2:
輸入:" hello world! "
輸出:「world! hello」
解釋:輸入字串可以在前面或者後面包含多餘的空格,但是反轉後的字元不能包括。
示例 3:
輸入:「a good example」
輸出:「example good a」
解釋:如果兩個單詞間有多餘的空格,將反轉後單詞間的空格減少到只含乙個。
示例 4:
輸入:s = " bob loves alice "
輸出:「alice loves bob」
示例 5:
輸入:s = 「alice does not even like bob」
輸出:「bob like even not does alice」
1 <= s.length <= 104
s 包含英文大小寫字母、數字和空格 ' '
s 中 至少存在乙個單詞
高階:
請嘗試使用 o(1) 額外空間複雜度的原地解法。
切片時需要排除空字元不進行拼接
class
solution
:def
reversewords
(self, s:
str)
->
str:
# 用' '進行切分單詞
world_list = s.split(
' ')
size =
len(world_list)
s_new =
''for i in
range
(size)
:# 逆序拼接單詞,排除空字元
if world_list[size -
1-i]
!=''
: s_new += world_list[size -
1-i]
+' '
# 去除末尾多加的' '
s_new = s_new.rstrip(
)return s_new
想一下,我們將整個字串都反轉過來,那麼單詞的順序指定是倒序了,只不過單詞本身也倒敘了,那麼再把單詞反轉一下,單詞就正過來了。
所以解題思路如下:
移除多餘空格(雙指標法)
將整個字串反轉
將每個單詞反轉
如動畫所示:
//2.移除中間空格
for(
; fastindex < s.
size()
; fastindex++
)//fastindex指向的元素為非空格
else
}//3.移除字串末尾空格,步驟2.去除中間空格時,會在結尾保留乙個空格
//由於s[slowindex++] = s[fastindex];slowindex接收完空格後又向後移動了乙個
if(slowindex -
1>
0&& s[slowindex -1]
==' '
)else
}//翻轉字串
void
reverse_s
(string &s,
int begin,
int end)
}//翻轉單詞
string reversewords
(string s)
//確定單詞結束位置
if(entry && s[i]
==' '
&& s[i -1]
!=' '
)//最後乙個單詞結束位置沒有空格
if(entry && i == s.
size()
-1&& s[i]
!=' ')}
return s;}}
;
翻轉字串裡的單詞
給定乙個字串,逐個翻轉字串中的每個單詞。示例 1 輸入 the sky is blue 輸出 blue is sky the 複製 示例 2 輸入 hello world 輸出 world hello 解釋 輸入字串可以在前面或者後面包含多餘的空格,但是反轉後的字元不能包括。複製 示例 3 輸入 a...
翻轉字串裡的單詞
給定乙個字串,逐個翻轉字串中的每個單詞。示例 1 輸入 the sky is blue 輸出 blue is sky the 示例 2 輸入 hello world 輸出 world hello 解釋 輸入字串可以在前面或者後面包含多餘的空格,但是反轉後的字元不能包括。示例 3 輸入 a good ...
翻轉字串裡的單詞
include include 給定乙個字串,逐個翻轉字串中的每個單詞。示例 1 輸入 the sky is blue 輸出 blue is sky the 示例 2 輸入 hello world 輸出 world hello 解釋 輸入字串可以在前面或者後面包含多餘的空格,但是反轉後的字元不能包括...