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
关键修改说明
- 空数组判断:直接返回0,避免空指针错误。
- 区间标准化:用
minmax统一区间格式,确保左小右大,同时基于标准化后的区间去重,消除等价重复项。 - 简化排序逻辑:仅对标准化后的数组按左端点排序,逻辑更清晰高效。
- 规范返回值:移除
p打印操作,直接返回计算结果,符合题目要求。 - 简洁求和:使用Ruby的
sum方法直接计算总长度,代码更简洁易读。
内容的提问来源于stack exchange,提问作者Transfer
相关产品推荐
相关产品推荐

