1. 程式人生 > 實用技巧 >Eureka服務治理-註冊中心和註冊服務

Eureka服務治理-註冊中心和註冊服務

題目描述

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

思路解析

  1. 去掉字串首位空格(這裡需要考慮的特殊情況:全是空格的情況)
  2. 使用雙指標ijij均初始化至字串末尾
  3. i向前移動,直至找到第一個為空格的字元,此時字串s的在ij之間的子字串即為最後一個單詞
  4. i繼續向前移動,直至找到下一個不為空格的字元,令ij均指向此處,重複步驟3,得到倒數第二個、第三個...、第n個單詞
  5. 為了方便處理邊界條件,即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;
    }
};