題目描述
給定一個字串 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
一堆。當我們倒敘遍歷的時候,就會拿到反轉的三堆skk
、ggf
、abc
,拿到一堆,就把這一堆給頭部追加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. 返回結果的時候,也要注意去除左側之前手動新增的空格哦
};
好記性不如爛筆頭,記錄一下吧^_^