Scala - 使用map函数将列表中的负数替换为前一个数字

3

我有一个数字列表

[1, 2, 3, -1000, 4, -1000]

我想编写一个map函数,将列表中所有的负数替换为前一个数(负数之前的数)

在这种情况下,输出将是

[1, 2, 3, 3, 4, 4]

编写这个map函数的最佳方法是什么?


如果第一个数字是负数,应该发生什么? - Lee
第一个数字不会是负数。 - ZhongBot
请注意,可能会有连续的负数 [1, -1000, -1000] 变成 [1, 1, 1] - ZhongBot
2个回答

4
yourList.foldLeft(List[Int]()) { (acc, i) => if (i >= 0) i :: acc else acc.head :: acc }.reverse

如果第一个数字为负数,将会抛出异常。

感谢Aivean提供的帮助。


1
请注意,您的方法将需要O(N^2)的时间,因为向列表末尾添加元素(以及获取最后一个元素)对于List来说需要O(N)的时间。 - Aivean
1
同时,您也将零替换为负数。 - Aivean
1
没错,朋友。下次你可以编辑我的帖子 :) - Lodewijk Bogaards
1
哦,现在你有点过了 :) 这是表演时间吗?那个人可能只是想完成他的家庭作业。 - Lodewijk Bogaards
1
这让我该睡觉了。 - Lodewijk Bogaards
显示剩余5条评论

1
def replaceNegatives(list: List[Int], prev: Int = 0): List[Int] = {
   list match {
     case Nil => Nil
     case (x :: xs) if x < 0 => prev :: replaceNegatives(xs, prev)
     case x :: xs => x :: replaceNegatives(xs, x)
   }
}

例子:

scala> replaceNegatives(List(1, 2, 3, -1000, 4, -1000))
res1: List[Int] = List(1, 2, 3, 3, 4, 4)

第二个参数 (prev) 是可选的;如果列表中的第一个项目为负数,则使用它作为默认值。

1
你的方法不是尾递归的,因此在大量输入时会失败。 - Aivean

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接