在scala中遍历两个数组

时间:2015-04-03 16:51:51

标签: arrays scala

我很难理解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步。

1 个答案:

答案 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