2015-04-03 41 views
-2

我很难理解Scala数组中的循环遍历。在scala中遍历两个数组

我有两个数组,并希望用两个指针遍历它们。一个指针从第一个数组的开始处开始。第二个指针从第二个数组的末尾开始。 我想在两个指针处的元素满足条件时从循环中断开。一次,我移动任何循环的一个指针。有人能帮助我如何解决这些问题。

我米试图在这里解决问题:http://www.geeksforgeeks.org/given-an-array-arr-find-the-maximum-j-i-such-that-arrj-arri/

鉴于阵列ARR [],找到最大的J - 我使得ARR [J]> ARR [I]

为了解决这个问题,我们需要得到arr []的两个最优索引:左指数i和右指数j。

1)对于一个元素arr [i],如果在arr [i]左边有一个小于arr [i]的元素,我们不需要考虑左边索引的arr [i]。 2)类似地,如果在arr [j]右侧存在更大的元素,那么我们不需要将这个j考虑为正确的索引。因此,我们构造两个辅助数组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

显示一些代码。你必须至少尝试过一些东西。给这里的人一个起点,提供反馈意见。仅仅说你不能做第4步,展示你试图做的事情,你想做什么以及差距在哪里。 – cmbaxter 2015-04-03 18:22:01

回答

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 
+0

这是一个蛮力的方法来解决这个问题。 M寻找类似于算法的东西,这可能有助于理解scala列表遍历 – Rajeev 2015-04-04 05:22:06