为什么本地运行代码的结果与LeetCode编译器输出结果不一致?
问题原因分析
- 最核心的原因是你混淆了操作的数据结构:你本地测试时传入的
head是普通数组,代码中用到的length属性、splice方法都是数组的标准成员,可以正常执行得到去重结果。而LeetCode中「删除重复元素」的对应高频题目为链表类题目,传入的head是链表节点对象,没有length属性,外层循环for(let i = 0; i < head.length; i++)的判断条件直接不成立,函数不会执行任何逻辑就原样返回输入的头节点,所以输出和输入完全一致。 - 代码本身存在不规范写法:
splice方法的第一个参数应为数字类型的索引,你写的是head.splice([a], 1),传入了数组[a],依赖JS的隐式类型转换才能正常运行,部分严格执行环境下可能出现异常。 - 原有数组去重逻辑存在缺陷:删除数组元素后数组长度会自动减1,但你的代码没有对内层循环的索引
a做回退处理,遇到3个及以上连续重复元素时会出现去重不彻底的问题,比如输入[1,1,1]会返回[1,1],如果测试用例包含这类输入也会导致结果不符合预期。 - 若你确认提交的是数组去重题目,另一个可能的原因是LeetCode判题逻辑要求返回新数组,不能直接修改输入的原数组,你的代码是在原数组上做修改,不符合判题规则导致结果校验不通过。
修复方案
若需求为数组去重
修复逻辑缺陷与不规范写法后的代码如下:
// 修改原数组的版本 var deleteDuplicates = (head) => { for(let i = 0; i < head.length; i++) { for(let a = i + 1; a < head.length; a++) { if(head[i] === head[a] ) { head.splice(a, 1) // 删除元素后索引回退,避免跳过相邻重复元素 a-- } } } return head; };
若需求为LeetCode链表去重
对应操作链表的正确代码如下:
var deleteDuplicates = function(head) { let current = head; while(current && current.next) { if(current.val === current.next.val) { // 跳过重复节点 current.next = current.next.next; } else { // 无重复则指针后移 current = current.next; } } return head; };
内容的提问来源于stack exchange,提问作者DAS
相关产品推荐
相关产品推荐

