力扣之反轉字串中的單詞 III

水冗水孚發表於2022-07-11

題目描述

給定一個字串 s ,你需要反轉字串中每個單詞的字元順序,同時仍保留空格和單詞的初始順序。

示例 1:

輸入:s = "Let's take LeetCode contest"
輸出:"s'teL ekat edoCteeL tsetnoc"

示例 2:

輸入: s = "God Ding"
輸出:"doG gniD"
力扣原題目地址:https://leetcode.cn/problems/...

思路分析

解法一 字串轉陣列反轉再轉字串

這種方式可讀性可以,即先把字串以空格為分割轉換成陣列,然後map迴圈把陣列中的每一項(字串),再轉成一個個的小陣列反轉再轉回來即可。程式碼如下:

let s = "abc fgg kks"
var reverseWords = function (s) {
    let arr = s.split(' ') // 此時arr為: ['abc', 'fgg', 'kks']
    arr = arr.map((item) => {
        return item.split('').reverse().join('') // 把每一項字串轉成陣列,在反轉顛倒,再轉回字串
    }) // map迴圈加工以後的arr為: ['cba', 'ggf', 'skk']
    return arr.join(' ') // 最終變成:'cba ggf skk'
};

解法二 倒敘遍歷分堆陣列頭部追加

思路:

比如:let s = "abc fgg kks",當我們倒敘遍歷的時候,就會得到'k','k','s',' ','g','g','f',' ','c','b','a',此時我們發現,反轉的確是反轉了,不過位置也反轉了。

於是乎,我們有這樣一個思路:分堆陣列頭部追加,這個案例,我們以空格為界限把字串分為三堆,分別是:abc一堆、fgg一堆、kks一堆。當我們倒敘遍歷的時候,就會拿到反轉的三堆skkggfabc,拿到一堆,就把這一堆給頭部追加unshift到陣列中去,這樣的話,每一堆的順序還是不變的。然後再轉成字串即可。程式碼如下:

let s = "abc fgg kks"
var reverseWords = function (ss) {
    // 1. 因為是以空格為區分,見到空格說明這一堆字串完畢,才會裝填到陣列中去,所以這裡手動再在原有字串頭部新增一個空格,用於區分一堆一堆的結束
    let s = ' ' + ss
    let arr = [] // 2. 建立一個陣列用於裝填一堆一堆的字串
    let tempStr = '' // 3. 由於遍歷得到的是一個一個的字串,所以再建立一個空字串用於拼接'堆'
    for (let i = s.length - 1; i >= 0; i--) {
        // 4. 倒敘第一個肯定不是空格的,所以看else語句中的程式碼
        if (s[i] === ' ') { // 5. 當遇到空格的時候,說明這一堆結束啦,一堆結束,那就一堆裝填唄
            arr.unshift(tempStr)  // 6. 把這一堆資料頭部追加到陣列中,這樣位置就不會變化咯
            arr.unshift(' ') // 7. 注意這裡需要手動再頭部追加一個空格,因為原來的字串也有空格哦,空格不能漏掉哦
            tempStr = '' // 8. 然後把用於拼接堆的字串重置,以便繼續重新拼接堆
        } else {
            tempStr = tempStr + s[i] // 5.1 拼接歸攏一堆,注意因為是反轉,所以是tempStr + s[i]拼接,不要寫反了哦
        }
    }
    console.log('陣列', arr); // 9. 列印看看 [' cba', ' ggf', ' skk']
    return arr.join('').trimStart() // 10. 轉成字串以後,別忘了把左側的空格給去掉哦
};
console.log(  reverseWords(s)  );

解法三 倒敘遍歷分堆字串頭部追加

這個和上方類似,就是把一堆一堆的字串使用字串頭部拼接(原來是使用陣列頭部追加,再轉字串),程式碼如下:

var reverseWords = function (ss) {
    let s = ' ' + ss // 1. 加空格做區分一堆一堆的字串
    let resultStr = '' // 2. 結果字串
    let tempStr = '' // 3. 拼接堆字串
    for (let i = s.length - 1; i >= 0; i--) {
        if (s[i] === ' ') { // 4. 倒敘第一個肯定不是空格
            resultStr = ' ' + tempStr + resultStr // 6. 把拼接好的一堆字串加到結果字串上
            tempStr = '' // 7. 然後把拼接字串重置為原來的狀態
        } else {
            tempStr = tempStr + s[i] // 5. 一堆字串拼接
        }
    }
    return resultStr.trimStart() // 8. 返回結果的時候,也要注意去除左側之前手動新增的空格哦
};
好記性不如爛筆頭,記錄一下吧^_^