『 JS算法-力扣557題』反轉字符串中的單詞 III

題目

力扣原題鏈接:557. 反轉字符串中的單詞 III

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

示例:

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

提示:

  • 在字符串中,每個單詞由單個空格分隔,並且字符串中不會有任何額外的空格。

本題是一道關於字符串的題目,在力扣的題庫中難度等級爲 簡單



分析

根據題目的 提示 得知,每個單詞由單個空格分格 ,所以我想到上圖所示的3大步:

  1. 使用 split() 方法把字符串按 空格 進行分格並組成數組
  2. 到這步操作的是數組的每個元素,把每個元素的字符串反轉一下
  3. 使用 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(' ')


其實以上這幾種方法基本都是用了同一個思路去解決。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章