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

Python列表元素赋值失效求助——Codewars区间求和挑战

问题分析与解决

为什么thing[1] = thing2[1]不生效?

  1. 临时变量无关联:你在循环里执行thing = list(thing)时,thing只是原元组的临时副本,和intervals里的原始元素没有绑定关系。原intervals存储的是不可变元组,修改这个临时列表的元素,根本不会影响原数组内容。
  2. 遍历中修改数组的隐患:嵌套循环里直接调用intervals.remove(tuple(thing2))会改变原数组长度,导致后续遍历出现元素跳过、索引混乱的问题,逻辑彻底失控。
  3. 求和逻辑错误:最后求和循环里用sum += thing[1] - thing[0],这里的thing是外层循环最后一次迭代的临时变量,不是当前遍历的thing3,计算结果完全错误。

正确实现思路

区间合并的标准解法是先排序再合并:

  • 按区间起始值从小到大排序所有区间;
  • 初始化合并列表,放入第一个区间;
  • 遍历后续区间,和合并列表最后一个区间对比:
    • 若当前区间起始值≤最后一个合并区间的结束值,说明重叠,更新结束值为两者最大值;
    • 若无重叠,直接加入合并列表;
  • 最后计算所有合并后区间的长度之和。

修正后的代码

def sum_of_intervals(intervals):
    if not intervals:
        return 0
    
    # 按区间起始值排序
    sorted_intervals = sorted(intervals, key=lambda x: x[0])
    merged = [list(sorted_intervals[0])]
    
    for current_start, current_end in sorted_intervals[1:]:
        last_start, last_end = merged[-1]
        if current_start <= last_end:
            # 重叠则合并,更新结束值为较大值
            merged[-1][1] = max(last_end, current_end)
        else:
            # 无重叠则添加新区间
            merged.append([current_start, current_end])
    
    # 计算总长度
    total = 0
    for start, end in merged:
        total += end - start
    return total

测试示例验证:

  • 输入[(1,5),(3,7)],合并后得到[[1,7]],总长度6,符合预期;
  • 输入[[1,4],[7,10],[3,5]],合并后得到[[1,5],[7,10]],总长度4+3=7,结果正确。

内容的提问来源于stack exchange,提问作者brutalthebigone

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 15:40:23