Scala:在Double of List中查找连续负数的最大总和

时间:2017-07-25 16:05:09

标签: scala list subset

我有一个var selected: [Int]? // FILL THIS ARRAY WITH `identifier` // Test1 selected = extractIdentifiers(mainArray: mainArray) // OUTPUT: [0, 3] // Test2 mainArray[0].innerArray![0].isBoolTrue = false selected = extractIdentifiers(mainArray: mainArray) // OUTPUT: [3] // Test3 mainArray[1].innerArray![0].isBoolTrue = false selected = extractIdentifiers(mainArray: mainArray) // OUTPUT: nil ,其中包含以下值:

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}

然后找到max = 41.29

3 个答案:

答案 0 :(得分:2)

您可以使用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)
     }

答案 1 :(得分:1)

您可以使用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

答案 2 :(得分:1)

如果确实意味着求和所有连续的负数,然后找到最大总和,就可以了。

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

<强>更新

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

{{1}}

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