2015-04-03 245 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