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

Scala中foldLeft处理含负数列表的计算异常求助

问题根源:负奇数的判断逻辑错误

你代码里的核心问题出在奇数的判断条件上:_%2==1只能匹配正奇数,但对于负奇数(比如-5、-15),在Scala中-5 % 2的结果是-1,不等于1,导致这些负奇数既没被分到evens列表,也没被分到odds列表,oddSum漏掉了这些数的统计,最终结果自然偏差。

修正方案1:修复奇数判断逻辑

把奇数的判断从_%2==1改成_%2 != 0(或者(_%2).abs == 1),这样就能覆盖所有正负奇数:

def sumOfEvenMinusOdd(l: List[Int]) : Int = {
  if (l.isEmpty) return 0 // 用isEmpty比length==0更高效,List的length是O(n)操作
  val evens = l.filter(_%2==0)
  val odds = l.filter(_%2 != 0) // 修改判断条件,覆盖正负奇数
  val evenSum = evens.foldLeft(0)(_+_)
  val oddSum = odds.foldLeft(0)(_+_)
  evenSum-oddSum
}

测试这个版本,i3就能正确返回-133了。

优化方案:一次遍历完成计算

原代码需要三次遍历列表(两次filter+两次foldLeft),可以优化成一次遍历,用foldLeft直接累加计算,既简洁又高效:

def sumOfEvenMinusOdd(l: List[Int]): Int = {
  l.foldLeft(0) { (acc, num) =>
    if (num % 2 == 0) acc + num // 偶数直接加到累加器
    else acc - num // 奇数从累加器减去,等价于 evenSum - oddSum
  }
}

这个逻辑的核心是:最终结果偶数和 - 奇数和,等价于把每个偶数加进去、每个奇数减去它(因为-oddSum等于sum(-odd)),一次遍历就能完成所有计算,同时天然解决了负奇数的判断问题。

验证测试用例

用优化后的代码测试三个用例:

  • sumOfEvenMinusOdd(List(1,3,5,4,5,2,1,0)) 返回 -9(正确)
  • sumOfEvenMinusOdd(List(2,4,5,6,7,8,10)) 返回 18(正确)
  • sumOfEvenMinusOdd(List(109, 19, 12, 1, -5, -120, -15, 30,-33,-13, 12, 19, 3, 18, 1, -1)) 返回 -133(正确)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 03:46:21