【问题标题】:Scala: Find max sum of consecutive negative numbers in a List of DoubleScala:在 Double 列表中查找连续负数的最大总和
【发布时间】:2017-07-25 16:05:09
【问题描述】:

我有一个 List[Double] 具有以下值:

{-1.2200000000000006, -1.3200000000000003, -1.0099999999999998, 22.22, 11.11, 
-31.310000000000002, -0.9799999999999986,-4, -5, 3, 2, 2.959999999999999}`

我要找到连续负数的最大总和。

所以从原始列表中分离出连续的否定和肯定列表

{ 
  {-1.2200000000000006, -1.3200000000000003, -1.0099999999999998},
  {22.22, 11.11},
  {-31.310000000000002, -0.9799999999999986,-4, -5},
  {3, 2, 2.959999999999999}
}

然后去掉连续的正数

{ 
  {-1.2200000000000006, -1.3200000000000003, -1.0099999999999998},
  {-31.310000000000002, -0.9799999999999986,-4, -5}
}

然后求和

{-3.5500000000000007, -41.29}

然后改为绝对值

{3.5500000000000007, 41.29}

然后找到 max = 41.29

【问题讨论】:

  • 你的问题有点模糊。 1 - 你想对连续的负数求和还是对所有连续的负数求和? 2 - 负数的总和也是负数,所以32.29 不可能是正确的。 3 - 最大负数是最接近零的一个。你想要最大值还是最小值?
  • @jwvh 我已编辑该消息以更好地解释它。它是连续负数的总和,而不是我认为现在发布的解决方案的负数 PAIRS 的总和。
  • 您可以使用此答案stackoverflow.com/questions/21800041/… 中的multiSpan。然后对子列表求和,取最小值,那么绝对值就是你想要的答案

标签: scala list subset


【解决方案1】:

您可以为此使用foldLeft

    val (max, _) = list.foldLeft((0,0)) { 
      case((max, current), n) if(n >= 0) => (max, 0)
      case((m, current), n) => 
         val sum = current - n
         (sum max m, sum)
     }

【讨论】:

  • 谢谢,但这给了我配对的总和。我想要连续编号的总和。我已经编辑了原始消息以提供更多详细信息。
  • 不,只要数字是负数,它的想法是累加总和。比如是val list = Seq(1, -1, -2, -3, 2, 3, -1, -5, -10, 4, 5),那么结果就是16。
【解决方案2】:

如果你真的求和所有连续的负数,然后找到最大和,这样就可以了。 p>

val nums = List(-1.2200000000000006, -1.3200000000000003, -1.0099999999999998, 
       22.22, 11.11, -31.310000000000002, -0.9799999999999986, 2.959999999999999)

nums.foldLeft(List[Double]()){
  case (l,n) if n < 0 => if (l.isEmpty) List(n) else n + l.head :: l.tail
  case (l, _) => Double.MinValue :: l
}.max
// res0: Double = -3.5500000000000007

更新

好的,一个小的改变会让你得到你想要的。

nums.foldLeft(List(0.0)){
  case (l,n) if n < 0 => n + l.head :: l.tail
  case (l, _) => 0.0 :: l
}.min.abs // res0: Double = 32.29

注意:您实际上追求的是最低金额。如果你想把它表示为一个正数,你可以在事后得到绝对值。

【讨论】:

  • 再次感谢,但这不是我想要的。我将在原始消息中提供更多详细信息。
  • 感谢@jwvh 感谢您对此提供的所有帮助。是的,这是一种享受。
【解决方案3】:

你可以使用sliding

对于连续的负数对的总和:

val doubles = List(-1.2200000000000006, -1.3200000000000003, ...)
val result = doubles.sliding(2)
                    .collect { case List(a, b) if a < 0 && b < 0 => List(a, b) }
                    .map(_.sum)
                    .min
                    .abs

【讨论】:

  • 谢谢,但这给了我配对的总和。我想要连续编号的总和。我已经编辑了原始消息以提供更多详细信息。
猜你喜欢
  • 1970-01-01
  • 2015-07-27
  • 1970-01-01
  • 2022-12-12
  • 2021-08-07
  • 2019-12-15
  • 2013-09-13
  • 1970-01-01
  • 2017-03-12
相关资源
最近更新 更多