这是一个简单的编码练习:找到给定列表中的所有局部最大值。 本地最大值是一个项目,它大于紧接其之前和之后的项目。
localMaxima of [2,9,5,6,1] is [9,6]
localMaxima of [2,3,4,1,5] == [4]
localMaxima of [1,2,3,4,5] == []
我写了这个函数如下:
def localMaxima(l: List[Int]) =
(l, l.tail, l.tail.tail).zipped.toList
.filter(t => t._2 > t._1 && t._2 > t._3)
.map(_._2)
您如何撰写本地最大值?
答案 0 :(得分:14)
scala> val l = List(2,9,5,6,1)
l: List[Int] = List(2, 9, 5, 6, 1)
scala> l.sliding(3).collect{ case a::b::c::Nil if a<b && b>c => b }.toList
res2: List[Int] = List(9, 6)
scala> val l = List(2,3,4,1,5)
l: List[Int] = List(2, 3, 4, 1, 5)
scala> l.sliding(3).collect{ case a::b::c::Nil if a<b && b>c => b }.toList
res3: List[Int] = List(4)
scala> val l = List(1,2,3,4,5)
l: List[Int] = List(1, 2, 3, 4, 5)
scala> l.sliding(3).collect{ case a::b::c::Nil if a<b && b>c => b }.toList
res4: List[Int] = List()
答案 1 :(得分:9)
我会使用滑动功能:
def localMaxima(list : List[Int]) = list.sliding(3).foldLeft(List[Int]()){
case (seed, Seq(a, b,c)) => if(b > a && b > c) b:: seed else seed
}
答案 2 :(得分:4)
在
上使用for comprehensionval a = List(2,9,5,6,1)
像这样,
for ( (v,w,u) <- (a,a.drop(1),a.drop(2)).zipped if v < w && w > u ) yield w
<强>更新强>
像这样使用filter
,
(1 to a.size-2).filter(i => a(i-1) < a(i) && a(i) > a(i+1) ).map(a(_)).toList