Codewars 刷題筆記|Remove String Spaces

Ya Chu
5 min readJul 27, 2023

--

題目連結:Remove String Spaces | Codewars

Instructions

Write a function that removes the spaces from the string, then return the resultant string.

Examples

Input -> Output
"8 j 8 mBliB8g imjB8B8 jl B" -> "8j8mBliB8gimjB8B8jlB"
"8 8 Bi fk8h B 8 BB8B B B B888 c hl8 BhB fd" -> "88Bifk8hB8BB8BBBB888chl8BhBfd"
"8aaaaa dddd r " -> "8aaaaaddddr"

Solution

思考方向

先把字串轉成單個字的陣列、把空白的 element 過濾掉,再組回字串。

function noSpace(x){
// Single out the spaces, return each characters in an array
const charAry = x.split('').filter( word => word!== ' ')
// Concat the words
return charAry.reduce((accum, current) => accum.concat(current))
}
  • split() 來把字串轉成陣列。因為要分割的是單個字母 (character) 而不是詞 (word),所以參數(條件)為空字串:split('')
  • filter() 篩選出非空格的值:word !== ' '
  • filter() 返回的陣列中的每個 element 透過 concat() 組回字串,因為要累加,所以使用了 reduce()

更好的解法

自己暫時沒有想到更好的優化方式,所以參考了其他人的解答。這幾種做法都比我的好很多:

  1. 用字串的 replace()透過 regex 條件,把非字母用空字串''替換掉
function noSpace(x){
return x.replace(/\s/g, '');
}

這個是我覺得最符合題意的做法,但不熟 regex 會擔心下錯條件

2. 用字串的 replaceAll()把空格' '替換成空字串''

function noSpace(x) {
return x.replaceAll(' ', '');
}

雖然有可能遇到空格不只一個的狀況,但即便是一個以上的空格也還是可以以一個空格為單位來過濾掉

3. 用 split(' ') 過濾掉空格,再用 join() 組回字串

function noSpace(x){return x.split(' ').join('')}

這也是用了 split() ,並且後續就直接用 join() 組回字串其實就可以了

這邊我也發現到,因為最後的答案還是要把所有的字組成一個字串,所以我之前擔心 split(' ') return 的會是詞而不是字,而改用 split('') 其實是多慮了,反而在組字串之前還要用 filter() 把空格篩掉

Key Takeaways

參考其他人的解答之後,發現自己根本對於 string 的 methods 太不熟悉了,都想要先轉成 array 處理再轉回 string ,其實根本多此一舉 XD

透過這個題目來複習一下幾個 methods:

string.replace()

replace(pattern, replacement)

Parameters:

  • pattern:可以是值也可以是 regex
  • replacement:可以是值也可以是 function

Return value: returns a new string (does not mutate the original string)

string.split()

split(separator)
split(separator, limit)

Parameters

  • separator: 可以是 undefined, string 或 regex
  • limit (optional): 可以設置 split 的上限,超過上限就不會回傳了。如果 limit0,回傳的結果就是[]

Return value: array

array.join()

join()
join(separator)

The join() method creates and returns a new string by concatenating all of the elements in an array

Parameters:

  • separator (optional):element 之間要用什麼相連。如果忽略不寫的話, element 會用逗號 "," 相連;如果是空白字串 "",element 全部組成沒有任何空格的 string
const elements = ['Fire', 'Air', 'Water'];

console.log(elements.join());
// Expected output: "Fire,Air,Water"

console.log(elements.join(''));
// Expected output: "FireAirWater"

console.log(elements.join('-'));
// Expected output: "Fire-Air-Water"

Return value: string;如果 arr.length 為 0 ,會回傳 empty string

--

--