2021-01-04 | 151. 翻轉字串裡的單詞

CUG-GZ發表於2021-01-04

1. 題目描述

給定一個字串,逐個翻轉字串中的每個單詞。

說明:

  • 無空格字元構成一個 單詞 。
  • 輸入字串可以在前面或者後面包含多餘的空格,但是反轉後的字元不能包括。
  • 如果兩個單詞間有多餘的空格,將反轉後單詞間的空格減少到只含一個。

示例 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) 額外空間複雜度的原地解法。

2. 解題思路

(1)使用JavaScript的API
對於這道題,我們可以直接使用JavaScript的API來完成這道題目:

  • 使用split()來將字串中每個單詞分隔,放在一個陣列中
  • 使用filter()來將多餘的空格過濾掉
  • 使用reverse()來反轉陣列元素
  • 使用join()將陣列元素拼接為字串

複雜度分析

  • 時間複雜度:O(N),其中 N 為輸入字串的長度。

  • 空間複雜度:O(N),用來儲存字串分割之後的結果。

(2)陣列操作
除了上述的方法之外,我們還可以用最普通的方法處理這個字串:

  • 首先將字串首尾UI的空格去除掉
  • 遍歷字串,將字串中單詞逐個遍歷出來,放在一個陣列中
  • 將陣列中的元素合併成一個字串

複雜度分析

  • 時間複雜度:O(N),其中 N 為輸入字串的長度。

  • 空間複雜度:O(N),其中N為遍歷期間儲存的陣列的長度。

3. 程式碼實現

(1)使用JavaScript的API

/**
 * @param {string} s
 * @return {string}
 */
var reverseWords = function(s) {
    return s.split(' ').filter(item => item).reverse().join(' ')
};

(2)單詞逐個處理

/**
 * @param {string} s
 * @return {string}
 */
var reverseWords = function(s) {
    let res = [], temp = [], cur = 0, str = s.trim(), len = str.length
    
    while(cur < len){
        while(cur < len && str.charAt(cur) !== ' '){
            temp.push(str.charAt(cur))
            cur++
        }
        if(temp.length){
            res.unshift(temp.join(''))
            temp = []
        }
        while(cur < len && str.charAt(cur) === ' '){
            cur++
        }
    }
    return res.join(' ')
};

4. 提交結果

(1)使用JavaScript的API
在這裡插入圖片描述

(2)單詞逐個處理
在這裡插入圖片描述

相關文章