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
相关产品推荐
相关产品推荐

