You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)的场景,虽然后果偶然正确,但逻辑存在隐患

调试技巧

  1. 构造小测试用例:手动设计能暴露问题的小规模输入,比如:
    • n=1, arr=[2,1,1,3](预期输出[2,1,3])
    • n=3, arr=[5,3,3,3,4](预期输出[5,4])
  2. 打印中间变量:在代码中添加打印语句,查看smallest_nums的内容,以及列表推导式中每个元素的判断结果
  3. 拆解逻辑分步验证:不要直接用列表推导式,改成循环遍历,逐个判断是否保留,同时统计已移除元素的数量,验证是否符合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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 13:41:18