題目
力扣原題鏈接:557. 反轉字符串中的單詞 III
給定一個字符串,你需要反轉字符串中每個單詞的字符順序,同時仍保留空格和單詞的初始順序。
示例:
輸入:"Let's take LeetCode contest" 輸出:"s'teL ekat edoCteeL tsetnoc"
提示:
- 在字符串中,每個單詞由單個空格分隔,並且字符串中不會有任何額外的空格。
本題是一道關於字符串的題目,在力扣的題庫中難度等級爲 簡單 。
分析
根據題目的 提示 得知,每個單詞由單個空格分格 ,所以我想到上圖所示的3大步:
- 使用
split()
方法把字符串按 空格 進行分格並組成數組 - 到這步操作的是數組的每個元素,把每個元素的字符串反轉一下
- 使用
jion()
方法把處理完的數組用 空格 相連轉換回字符串
其中 第一步 和 第三步 都比較容易處理,難點在 第二步。
第一步:字符串轉成數組
第一步 使用 split(' ')
方法把字符串按 空格 分割成數組。注意:單引號中間是有一個空格的!!
分割後的數據結構如下所示
[
"Let's",
"take",
"LeetCode",
"contest"
]
第二步:反轉操作(難點)
第二步 是反轉數組元素的字符順序,但數組元素的順序不反轉。
這時我想到數組有一個和反轉相關的方法:reverse()
。
但 reverse()
的作用是反轉數組元素順序而不是字符串順序,所以可以用 第一步 的思路再推演下去,將數組的每項都適用 split()
方法再轉換成數組,也就是一個二維數組,結構如下所示
[
["L", "e", "t", "'", "s"],
["t", "a", "k", "e"],
["L", "e", "e", "t", "C", "o", "d", "e"],
["c", "o", "n", "t", "e", "s", "t"]
]
然後使用 reverse()
方法把 第二維 的數據反轉一下,數據結構變成如下所示
[
["s", "'", "t", "e", "L"],
["e", "k", "a", "t"],
["e", "d", "o", "C", "t", "e", "e", "L"],
["t", "s", "e", "t", "n", "o", "c"]
]
第三步:數組轉回字符串
第二步操作完後數據就變成一個二維數組,此時只需把二維數組轉換成一維數組,再把一維數組轉成字符串就大功告成了。
二維轉一維:join('')
。注意沒有空格
[
"s'teL",
"ekat",
"edoCteeL",
"tsetnoc"
]
一維轉字符串:join(' ')
。此時是有空格的!!!
"s'teL ekat edoCteeL tsetnoc"
編碼
根據上面的思路,代碼如下所示
let str = "Let's take LeetCode contest"
function reverseWords(str) {
// 【步驟1】字符串按 空格進行分隔,保存數組,數組的元素的先後順序就是單詞的順序
let arr = str.split(' ')
// 【步驟2】對數組進行遍歷,每個元素進行反轉
let result = arr.map(item => {
return item.split('').reverse().join('')
})
// 【步驟3】數組轉成字符串,並用空格隔開
return result.join(' ')
}
console.log(reverseWords(str)) // "s'teL ekat edoCteeL tsetnoc"
優化
【方案1】減少變量
根據上面的代碼修改,把不需要的變量減少聲明
let reverseWords = function(str) {
return str.split(' ').map(item => {
return item.split('').reverse().join('')
}).join(' ')
}
【方案2】正則匹配1
let reverseWords = function(str) {
// 正則 \s 表示空格
return str.split(/\s/g).map(item => {
return item.split('').reverse().join('')
}).join(' ')
}
【方案3】正則匹配2
let reverseWords = function(str) {
// 把單詞一個個識別出來 \w 表示字母 ' 表示 ' 。
return str.match(/[\w']+/g).map(item => {
return item.split('').reverse().join('')
}).join(' ')
}
【方案4】一行代碼搞掂
let reverseWords = function(str) {
return str.split('').reverse().join('').split(/\s/g).reverse().join(' ')
}
【方案5】展開運算符
let reverseWords = str => [...str].reverse().join('').split(' ').reverse().join(' ')
其實以上這幾種方法基本都是用了同一個思路去解決。