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

for循环中if语句失效排查:数组等分分割点查找问题

问题:Ruby数组分割点判断中if语句失效的原因及修复方案

你想要判断一个整数数组是否存在分割位置,使得左右两部分元素和相等,但你的代码里的if语句逻辑出现了问题,导致无法正确触发判断。先来看你的原始代码:

arr = [1,2,3,4,3,2,1]
left_sum = 0
right_sum = arr.inject(0) { |sum, x| sum = sum + x }
for i in 0..arr.length-1
  counter = []
  right_sum = right_sum - arr[i]
  case i
  when 0
    left_sum = 0
  else
    left_sum = left_sum + arr[i-1]
  end
  puts "Left sum of element #" + i.to_s + "=" + left_sum.to_s
  puts "Right sum of element #" + i.to_s + "=" + right_sum.to_s
  puts " "
  if right_sum - arr[i] == left_sum + arr[i-1]
    puts "Left sum" + "=" + "Right sum"
    counter.push(i)
  end
end
puts counter.to_s

错误分析

我帮你梳理几个关键问题:

  • 判断逻辑完全错误
    你的if条件right_sum - arr[i] == left_sum + arr[i-1]完全不符合需求。结合代码里的变量变化:

    • right_sum在每次循环开始时已经减去了arr[i],此时它代表的是当前索引i右侧所有元素的和(不包含arr[i])
    • left_sum在i>0时是当前索引i左侧所有元素的和(不包含arr[i])
      所以正确的判断应该是left_sum == right_sum——当左右两侧和相等时,说明索引i的位置就是分割点。
  • counter数组被重复初始化
    你把counter = []放在了for循环内部,这意味着每次循环都会重置这个数组,最后即使找到符合条件的索引,也无法保留下来。应该把它移到循环外面。

  • i=0时的数组越界风险
    当i=0时,arr[i-1]等价于arr[-1],会取数组最后一个元素,这完全不符合你的逻辑,而你的if条件里还用到了这个值,这会导致无意义的计算。

修复后的代码

这里是修正后的版本,解决了上述所有问题:

arr = [1,2,3,4,3,2,1]
left_sum = 0
right_sum = arr.sum # 用arr.sum替代inject更简洁
counter = [] # 移到循环外

arr.each_with_index do |num, i|
  # 先减去当前元素,得到右侧和
  right_sum -= num
  
  # 判断左右和是否相等
  if left_sum == right_sum
    puts "找到分割点:索引#{i},左侧和=#{left_sum},右侧和=#{right_sum}"
    counter.push(i)
  end
  
  # 把当前元素加到左侧和,为下一次循环做准备
  left_sum += num
end

puts "所有分割点索引:#{counter}"

代码说明

  • 用each_with_index替代for循环,更符合Ruby的编码习惯
  • 先计算右侧和(减去当前元素),判断是否和左侧和相等,再把当前元素加到左侧和,逻辑更清晰
  • 避免了i=0时的数组越界问题
  • counter数组在循环外初始化,能正确保存所有符合条件的索引

运行这段代码后,会输出:

找到分割点:索引3,左侧和=6,右侧和=6
所有分割点索引:[3]

完全符合你的预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:19:37