iT邦幫忙

2023 iThome 鐵人賽

DAY 9
0
自我挑戰組

解三十天的 CodeWars系列 第 9

Moving Zeros To The End

  • 分享至 

  • xImage
  •  

CodeWars 題目

Link

難度

5 kyu

題目

將 0 全部放到陣列最後面,其他元素保持原本順序。

思路

已知的情況是,在非嚴謹的 == 判斷中,false 會被判斷為 0。
因為 == 有自動轉換型別的特性,"0" 也會被判斷為 0。

使用正則表達式判斷陣列元素。
並且根據 match 的陣列長度,決定要加幾個 0。

pseudo code

let str = arr.join("")
let regex = /.../
let result = str.match(regex)
let zeroArr = new Array(result.length).fill(0)

str = str.replace(regex,"").split("")

return str.concat(zeroArr)

在這個構思中犯了幾個錯誤,最一開始是把正則寫成 /^0$/;但這個正則只會匹配驗證字串只有一個 0 的時候;如果想驗證字串中所有的 0,應該使用 g 關鍵字。

陣列使用 str.join(””),會被拆成一個個字元,無法復原為原本的類型。
例如:false ⇒ f,a,l,s,e ⇒ “false”。

因此實作中改變了作法,但基本概念一樣。

實作

function moveZeros(arr) {
   let result = arr.filter(item => !/0/.test(item) || typeof item !== "number")
   return result.concat(new Array(arr.length - result.length).fill(0));
}

使用 filter 過濾陣列元素;如果元素不是 0,或者類型不是 number;則返回組成新陣列。
將原陣列長度扣除新陣列長度,即為 0 陣列的長度。

使用 concat 拼接一個新陣列,帶入算得的長度,再填滿 0 即為解答。

他人的解法

var moveZeros = function (arr) {
  return arr.filter(function(x) {return x !== 0}).concat(arr.filter(function(x) {return x === 0;}));
}

也是類似的概念,但調用了兩次 filter。
第一次 filter 取不是 0 的新陣列,一樣用 concat 拼接,另外一個嚴格等於 0 的新陣列。

心得

最近發現自己在解題的時候常犯的錯誤,就是把本來可以簡單解決的問題複雜化了。
要怎麼去分析問題(以工作來說,就是實作方式?)也是一門需要經驗累積的學問啊~


上一篇
String incrementer
下一篇
A Man and his Umbrellas
系列文
解三十天的 CodeWars30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言