Eureka服務治理-註冊中心和註冊服務
阿新 • • 發佈:2020-09-10
題目描述
輸入一個英文句子,翻轉句子中單詞的順序,但單詞內字元的順序不變。為簡單起見,標點符號和普通字母一樣處理。例如輸入字串"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"
解釋: 如果兩個單詞間有多餘的空格,將反轉後單詞間的空格減少到只含一個。
說明:
無空格字元構成一個單詞。
輸入字串可以在前面或者後面包含多餘的空格,但是反轉後的字元不能包括。
如果兩個單詞間有多餘的空格,將反轉後單詞間的空格減少到只含一個。
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/fan-zhuan-dan-ci-shun-xu-lcof
思路解析
- 去掉字串首位空格(這裡需要考慮的特殊情況:全是空格的情況)
- 使用雙指標
i
和j
,i
和j
均初始化至字串末尾 i
向前移動,直至找到第一個為空格的字元,此時字串s
的在i
和j
之間的子字串即為最後一個單詞i
繼續向前移動,直至找到下一個不為空格的字元,令i
和j
均指向此處,重複步驟3,得到倒數第二個、第三個...、第n個單詞- 為了方便處理邊界條件,即
i == 0
的情況,在第3步之前,對輸入的字串去掉首位空格後,在此字串首插入一個空格。
程式碼實現
class Solution { public: string reverseWords(string s) { // Exception if(s == "") return s; // Init string result; int i, j; i = 0; j = s.length() - 1; // Erase start and end space while(i < s.length() && s[i] == ' ') i++; while(j >= 0 && s[j] == ' ') j--; s.erase(j + 1, s.length() - j); if(j > i) s.erase(0, i); if(s.length() == 0) return s; // Work s = ' ' + s; i = s.length() - 1; j = s.length() - 1; while(i > 0) { while(s[i] != ' ') i--; result += s.substr(i + 1, j - i); result += ' '; while((i > 0) && (s[i] == ' ')) i--; j = i; } result.erase(result.length() - 1, 1); return result; } };