我很难理解Scala数组中的循环遍历。
我有两个数组,想要用两个指针迭代它们。一个指针从第一个数组的开始开始。第二个指针从第二个数组的结尾开始。 当两个指针的元素满足条件时,我想从循环中断开。一次,我移动任何循环的一个指针。有人可以帮助我解决这些问题。
我正在尝试解决此问题:http://www.geeksforgeeks.org/given-an-array-arr-find-the-maximum-j-i-such-that-arrj-arri/
给定一个数组arr [],找到最大的j - i,使得arr [j]> ARR [I]
要解决这个问题,我们需要得到两个arr []的最佳索引:左索引i和右索引j。
1)对于元素arr [i],如果在arr [i]的左侧有一个小于arr [i]的元素,我们不需要考虑arr [i]左边的索引。
2)同样,如果arr [j]右侧有一个更大的元素,那么我们不需要将这个j视为右索引。
3)因此我们构造了两个辅助数组LMin []和RMax [],使得LMin [i]保持arr [i]左侧的最小元素,包括arr [i],并且RMax [j]保持最大arr [j]右侧的元素包括arr [j]。在构造这两个辅助数组之后,我们从左到右遍历这两个数组。
4)当我们看到LMin [i]大于RMax [j]时,遍历LMin []和RMa []时,我们必须继续前进LMin [](或者做i ++),因为左边的所有元素都是LMin [i]大于或等于LMin [i]。否则,我们必须在RMax [j]中继续前进以寻找更大的j - i值。
val list =List(34, 8, 10, 3, 2, 80, 30, 33, 1)
// Get all the minimum elements on left side for each index
val minElementWithLeftIndexes = list.zipWithIndex.foldLeft(List((list(0), 0)), (list(0), 0))((l,r) => if(l._2._1 >= r._1) (l._1 :+r, r) else (l._1:+l._2, l._2))._1.drop(1)
val maxElementWithRightIndexes = list.zipWithIndex.foldRight(List((list.last, list.length-1)), (list.last, list.length-1))((r,l) => if(l._2._1 <= r._1) (l._1 :+ r, r) else (l._1:+l._2, l._2))._1.drop(1)
println(minElementWithLeftIndexes)
println(maxElementWithRightIndexes)
//Step 4 : traverse on two lists to get the max value
无法使用scala执行第4步。
答案 0 :(得分:1)
def f(l: List[Int]): Int = {
l.map { x => l.map { y => (y, x)}}.flatten
.filter(z => z._1 > z._2)
.map { p => l.indexOf(p._1) - l.indexOf(p._2)}.max
}
f: (l: List[Int])Int
scala> val l = List(9, 2, 3, 4, 5, 6, 7, 8, 18, 0)
scala> f(l)
res0: Int = 8
scala> val l = List(34, 8, 10, 3, 2, 80, 30, 33, 1)
scala> f(l)
res1: Int = 6
scala> val l = List(1, 2, 3, 4, 5, 6)
scala> f(l)
res2: Int = 5
scala> val l = List(6, 5, 4, 3, 2, 1)
scala> f(l)
res3: Int = -1