首页 文章

在scala中遍历两个数组

提问于
浏览
-2

我很难理解Scala数组中的循环遍历 .

我有两个数组,并希望用两个指针迭代它们 . 一个指针从第一个数组的开始开始 . 第二个指针从第二个数组的结尾开始 . 当两个指针的元素满足条件时,我想从循环中断开 . 一次,我移动任何循环的一个指针 . 有人可以帮我解决这些问题 .

I m trying to solve the problem herehttp://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 [](或者我)中前进,因为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

Not able to do step 4 with scala.

1 回答

  • 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
    

相关问题