我正在研究 CodeWars kata Array.diff:
你在這個 kata 中的目標是實作一個差異函式,它從另一個串列中減去一個串列并回傳結果。
它應該從 list 中洗掉所有值
a,這些值存在于 list 中,并b保持其順序。arrayDiff([1,2],[1]) == [2]如果一個值存在于 中
b,則必須從另一個中洗掉它的所有出現:arrayDiff([1,2,2,2,3],[2]) == [1,3]
我的代碼:
function arrayDiff(a, b) {
for(let i = 0; i<b.length; i ){
for(let j = 0; j<a.length; j ){
if(b[i]===a[j]){
a.splice(j,1)
}
}
}
return a;
}
不知何故,雖然它適用于大多數陣列,但它不能為某些陣列提供正確的結果。我到底哪里錯了?
uj5u.com熱心網友回復:
splice在您正在迭代的陣列上使用是很棘手的。通過從該陣列中洗掉當前元素,它之后的元素現在出現在比它們之前的位置小一的索引處,但回圈變數仍將在下一次迭代中增加。
此外,該演算法的時間復雜度很差,在整個索引范圍內都有雙回圈。
您可以在線性時間內執行此操作:首先創建 aSet以便它僅保留出現在第二個陣列中的唯一值,然后過濾第一個陣列以獲取未出現在該集合中的值。
在這個劇透中使用了這個想法:
function array_diff(a, b) { const remove = new Set(b); return a.filter( k => !remove.has(k) ); }
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/530674.html
