CodeWars Array.diff Kata 代码问题:我的实现为何部分用例失败?
Array.diff代码的问题分析与修复
你的代码核心问题是在遍历数组a时使用splice修改原数组,导致索引错位,跳过了相邻的重复元素。
举个典型的错误场景:当a = [2,2,2]、b = [2]时:
- 第一次循环
j=0,发现a[0] === 2,执行splice(0,1),数组a变为[2,2]。 - 紧接着
j自增到1,此时遍历的是新数组的a[1](即原数组的第三个2),删除后数组变为[2]。 j继续自增到2,此时j >= a.length(2 >= 1),循环结束,最后剩下的一个2没有被删除,导致结果不符合预期。
修复方案1:修正索引错位
在删除元素后,将j减1,确保下一次循环能检查到被删除元素的下一个位置(现在的当前索引):
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); j--; // 回退索引,避免跳过相邻元素 } } } return a; }
修复方案2:更高效简洁的实现(推荐)
利用filter方法结合Set的O(1)查找特性,既不修改原数组,又能大幅提升性能(尤其当b数组较大时):
function arrayDiff(a, b) { const bElements = new Set(b); return a.filter(item => !bElements.has(item)); }
这个逻辑很直观:遍历数组a,只保留不在bElements集合中的元素,完美符合题目要求的「保留原顺序、移除所有b中存在的元素」。
内容的提问来源于stack exchange,提问作者Emir Kaan Sarıçam
相关产品推荐
相关产品推荐

