力扣 – 劍指 Offer 58 – I. 翻轉單詞順序

題目

劍指 Offer 58 – I. 翻轉單詞順序

思路1

  • 假如題目要求我們翻轉字元串,那麼我們可以從末尾往前開始遍歷每一個字元,同時將每一個字元添加到臨時空間,最後輸出臨時空間的數據就完成翻轉了,這就是倒敘遍歷字元串,即從最末尾開始遍歷。但是這一題又有些不同,題目要求是以單詞為單位進行翻轉字元串,所以我們使用雙指針來找到一個完整的單詞,剩下的步驟基本和上面的一樣了,將單詞按順序存到臨時的空間,最後輸出即可。

程式碼

class Solution {
    public String reverseWords(String s) {
        // 先去除首位空格
        s = s.trim();
        StringBuilder sb = new StringBuilder();

        int begin = s.length() - 1;
        int end = s.length() - 1;
        while (end >= 0) {
            // 查找第一個空格
            while (begin >= 0 && s.charAt(begin) != ' ') {
                begin--;
            }
            // 找到空格後添加單詞,同時手動添加空格
            sb.append(s.substring(begin+1, end+1) + " ");
            // 查找下一個單詞的開始
            while (begin >= 0 && s.charAt(begin) == ' ') {
                begin--;
            }
            // 設置下一個單詞的結束部分
            end = begin;
        }
        // 由於末尾多了個空格,需要刪除
        s = sb.toString().trim();

        return s;
    }
}

複雜度分析

  • 時間複雜度:\(O(N)\),遍歷一次字元串花費的時間是 N
  • 空間複雜度:\(O(N)\),臨時存儲字元串所用的空間