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

Codewars 4kyu Sum of Intervals Ruby解决方案无法通过Attempt求助

问题排查与修正方案

代码存在的问题

  • 空数组处理失效:当输入为空数组时,intervals.first返回nil,后续访问arr.last.last会触发NoMethodError。
  • 冗余且无效的预处理:第一行intervals.uniq.sort_by!(&:last)是原地修改数组,但随后又重新按左端点排序,这步操作完全多余;同时uniq只能去除完全相同的区间,无法处理[2,1]和[1,2]这类等价区间。
  • 未处理反向区间:若输入包含左端点大于右端点的区间(如[5,3]),计算interval[1]-interval[0]会得到负数,导致总和错误。
  • 输出不符合要求:使用p sum打印结果,虽然会返回sum,但不符合函数仅返回结果的规范,可能干扰测试判断。

修正后的代码

def sum_of_intervals(intervals)
  return 0 if intervals.empty?

  # 标准化区间:确保左端点<=右端点,同时去重等价区间
  normalized = intervals.map { |a, b| [a, b].minmax }.uniq

  # 按左端点升序排序
  sorted = normalized.sort_by(&:first)

  # 合并重叠或相邻的区间
  merged = sorted.each_with_object([sorted.first]) do |interval, arr|
    last_interval = arr.last
    if interval.first <= last_interval.last
      # 合并区间:保留最小左端点和最大右端点
      arr[-1] = [last_interval.first, [last_interval.last, interval.last].max]
    else
      arr << interval
    end
  end

  # 计算所有合并后区间的总长度
  merged.sum { |start, end_| end_ - start }
end

关键修改说明

  1. 空数组判断:直接返回0,避免空指针错误。
  2. 区间标准化:用minmax统一区间格式,确保左小右大,同时基于标准化后的区间去重,消除等价重复项。
  3. 简化排序逻辑:仅对标准化后的数组按左端点排序,逻辑更清晰高效。
  4. 规范返回值:移除p打印操作,直接返回计算结果,符合题目要求。
  5. 简洁求和:使用Ruby的sum方法直接计算总长度,代码更简洁易读。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 10:52:08