2014-03-24 25 views
1

我正在通過一些練習題來磨合我的Ruby技巧,我正在研究這個問題,我必須將二維數組旋轉90度。這是輸入:如何使用Ruby旋轉這個二維數組?

image = [ 
     [1,2,3,4], 
     [5,6,7,8], 
     [9,0,1,2], 
     [3,4,5,6] 
    ] 

和預期的輸出結果是:

image = [ 
     [3,9,5,1], 
     [4,0,6,2], 
     [5,1,7,3], 
     [6,2,8,4] 
    ] 

這是我寫的代碼,其打印出不正確的輸出:

def matrix(image) 
    y = image.length 
    for i in 0..y-1 
     for j in 0..y-1 
      image[i][j] = image[i][y-j-1] 
     end 
    end 
    image 
end 

這是從該代碼輸出:

image = [ 
    [4, 3, 3, 4], 
    [8, 7, 7, 8], 
    [2, 1, 1, 2], 
    [6, 5, 5, 6] 
] 

有人可以向我解釋我做錯了什麼嗎?

+0

查看答案我發佈了,與您的方法類似。 –

+0

@AlokAnand Cool非常感謝,我真的很喜歡你的答案! – Jamaal

回答

1
image = [ 
     [1,2,3,4], 
     [5,6,7,8], 
     [9,0,1,2], 
     [3,4,5,6] 
    ] 

y = image.length 
new_arr = [] 
for i in 0..y-1 
    new_arr << image[i].dup 
    for j in 0..y-1 
    if y-j-1 == i || i > y-j-1 
     image[i][j] = new_arr[y-j-1][i] 
    else 
     image[i][j] = image[y-j-1][i] 
    end 
    end 
end 

#=> [[3, 9, 5, 1], [4, 0, 6, 2], [5, 1, 7, 3], [6, 2, 8, 4]] 
3

我會做使用Array#transpose

image = [ 
     [1,2,3,4], 
     [5,6,7,8], 
     [9,0,1,2], 
     [3,4,5,6] 
    ] 

image.transpose.map(&:reverse) 
# => [[3, 9, 5, 1], [4, 0, 6, 2], [5, 1, 7, 3], [6, 2, 8, 4]] 
+0

確定很酷的答案,但我如何解決我寫的代碼,以輸出相同的結果? – Jamaal

+2

@Jamaal當這是一種乾淨,高效,簡單的實現目標的方式時,爲什麼要堅持使用代碼? – pjs

+0

@pjs我只是想知道爲什麼我寫的代碼不起作用,這全是 – Jamaal

2

你解決的主要問題是,你改變你遍歷數組。想想一個[2x2]矩陣:

[ 
    [1, 2], 
    [3, 4] 
] 

現在,你重複第一個索引(0,0),並指定在(1,0)的位置,現在你的矩陣是:

[ 
    [3, 2], 
    [3, 4] 
] 

現在,不管你的算法的其他部分 - 你在位置(0,0)丟失了1

算法中可能會有更多的錯誤 - 但這是你的展示瓶塞 - 你應該創建一個新的數組,而不是覆蓋現有的數組。

+0

yes..exactly..OP在每次迭代中丟失數據。 –

+0

好的非常感謝! – Jamaal