Codewars题解求助:移除数组中n个最小元素的Python代码调试
问题分析与调试方案
题目要求
给定整数数组,移除其中n个最小元素:
- 相同值元素优先移除索引较小的
- n>数组长度时返回空数组;n≤0时返回原数组
- 保留剩余元素的原有顺序
现有代码的核心缺陷
你的代码逻辑无法正确处理重复元素场景,导致大量测试失败:
def remove_smallest(n, arr): if n > 0: smallest_nums = sorted(arr)[:n] return [x for x in arr if x not in smallest_nums] return arr
错误原因
- 重复元素误删:当数组存在多个相同最小值时,
smallest_nums会包含多个该值,用x not in smallest_nums会一次性移除所有等于该值的元素,而非按要求只移除前n个(索引较小的)。例如:- 输入
n=1, arr=[1,1,2],正确输出应为[1,2],但你的代码会返回[2]
- 输入
- 边界情况处理不严谨:未明确处理
n≥len(arr)的场景,虽然后果偶然正确,但逻辑存在隐患
调试技巧
- 构造小测试用例:手动设计能暴露问题的小规模输入,比如:
n=1, arr=[2,1,1,3](预期输出[2,1,3])n=3, arr=[5,3,3,3,4](预期输出[5,4])
- 打印中间变量:在代码中添加打印语句,查看
smallest_nums的内容,以及列表推导式中每个元素的判断结果 - 拆解逻辑分步验证:不要直接用列表推导式,改成循环遍历,逐个判断是否保留,同时统计已移除元素的数量,验证是否符合n的要求
修正后的代码实现
def remove_smallest(n, arr): if n <= 0: return arr.copy() if n >= len(arr): return [] # 生成(元素值, 索引)的列表,按值升序、索引升序排序 sorted_pairs = sorted((val, idx) for idx, val in enumerate(arr)) # 提取需要移除的索引集合 remove_indices = {idx for val, idx in sorted_pairs[:n]} # 保留不在移除索引中的元素,维持原顺序 return [val for idx, val in enumerate(arr) if idx not in remove_indices]
内容的提问来源于stack exchange,提问作者rpicoder
相关产品推荐
相关产品推荐

