劍指Offer 翻轉單詞順序

2021-10-18 20:02:26 字數 2077 閱讀 3290

輸入乙個英文句子,翻轉句子中單詞的順序,但單詞內字元的順序不變。為簡單起見,標點符號和普通字母一樣處理。例如輸入字串"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 ...