LeetCode数组去重:两种算法差异及我的解法失效原因咨询
问题:LeetCode数组去重(返回长度)的实现问题
这是LeetCode上的经典数组去重问题,要求去除数组中的重复元素并返回去重后的数组长度。
正确解法示例
dict1 = {} arr = [] for i in nums: if i not in dict1: dict1[i] = 1 arr.append(i) nums[:] = arr return len(nums)
你的实现问题分析
嘿,我来帮你拆解下代码失效的原因!你写的代码无法正常运行,核心问题出在遍历数组的同时直接修改原数组,咱们具体看看:
你的代码:
hash = {} for num in nums: if num in hash: nums.remove(num) hash[num] = num return len(nums)
关键错误点
遍历中修改数组导致元素跳过:当你在
for循环里调用nums.remove(num)时,数组的长度和元素位置会立刻改变,循环的迭代器不会自动调整,导致部分元素被跳过。举个具体例子:
假设原数组是[1,1,2]:- 第一次循环,
num是第一个1,不在hash中,执行hash[1] = 1; - 第二次循环,
num是第二个1,已在hash中,执行nums.remove(1),此时数组变成[1,2]; - 循环的迭代器原本指向原数组的第二个位置,现在数组长度变为2,循环直接结束,剩下的那个
1完全没被处理,最终数组里仍有重复元素,返回的长度自然不符合预期。
- 第一次循环,
(次要问题)
hash字典的使用可以简化:其实用集合set来记录已出现元素会更简洁,比如seen = set(),但这不是代码失效的核心原因。
修复思路
如果你想在原数组上操作,可以改用双指针法(这也是该问题推荐的最优解法),或者像正确示例那样先收集不重复元素再替换原数组,避免在遍历过程中修改数组结构。
内容的提问来源于stack exchange,提问作者merry-go-round
相关产品推荐
相关产品推荐

