我很難理解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步。
顯示一些代碼。你必須至少嘗試過一些東西。給這裏的人一個起點,提供反饋意見。僅僅說你不能做第4步,展示你試圖做的事情,你想做什麼以及差距在哪裏。 – cmbaxter 2015-04-03 18:22:01