5 kyu
將 0 全部放到陣列最後面,其他元素保持原本順序。
已知的情況是,在非嚴謹的 == 判斷中,false 會被判斷為 0。
因為 == 有自動轉換型別的特性,"0" 也會被判斷為 0。
使用正則表達式判斷陣列元素。
並且根據 match 的陣列長度,決定要加幾個 0。
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 的新陣列。
最近發現自己在解題的時候常犯的錯誤,就是把本來可以簡單解決的問題複雜化了。
要怎麼去分析問題(以工作來說,就是實作方式?)也是一門需要經驗累積的學問啊~