對角線列印二維陣列問題

2021-08-19 22:14:16 字數 3847 閱讀 6909

最近在網上看到這樣一道面試題:二維陣列(n*n),沿對角線方向,從右上角列印到左下角如n=4:

4*4二維陣列

列印順序

4 3 8

2 7 12

1 6 11 16

5 10 15

9 14

13 網上已經有各種解法,也有現成的程式,但是個人都不是很滿意,網路上的思路都不是很清晰。現在提供一種分析思路及源**

對於乙個二維陣列,我們畫出示意圖如下:

當column = row時,就是乙個方正的陣列,我們現在來考慮如何列印符合題目要求的。

其實這個問題優一種很簡單的解法,就是在數很小時,寫出每個列印的座標,然後來找規律。但是我覺得不夠好,我們先來畫出題目要求打出的順序的示意圖。(4 x 4 陣列)

根據示意圖,我們可以分兩步來考慮這個問題。

第一步:先列印那四根黑色的線串聯起來的元素。如果我們按照逆時針的方向來串聯元素,那麼就有如下的示意圖:

0輪列印 3

1輪列印 2 7

2輪列印 1 6 11

。。。假設陣列有n * n 大小,k從 n-1 迴圈到 0

(n-1 - k) 輪列印為 a[0][k] a[1][k + 1] ….a[n-1 - k][n-1] ,那麼對於每一輪列印,我們就有以下**

我們可以認為,第一步就是從n - 1列遍歷到0列

//右上角,我們可以認為先從n - 1 到 0 列

for (int k = n -1 ; k >=0; k--)

//換行

logutil.println("");

}

第二步:處理到了0這個對角線之後,我們可以看藍色的三根線,這裡我們可以認為從1 行遍歷到n -1行,那麼k從1 迴圈到n-1

k輪:a[k][0] a[k+1][1] … a[n-1][n-1 - k]

//再從1 到 n - 1 行

for (int k =1 ; k <= n -1; k++)

//換行

logutil.println("");

}

這樣將兩個迴圈合併在一起,我們就認為,我們把這個陣列按照從右上角對角線列印全部列印完了。

/**

* 左上角開始列印二維矩陣陣列

*@param array

*/private

static

void

printtwodimensionalarraytopright(int array)

//換行

logutil.println("");

}//再從1 到 n - 1 行

for (int k = 1 ; k <= n - 1; k++)

//換行

logutil.println("");

}logutil.println("");

}

執行開始的題目,我們能得到的輸出結果如下:

1  2  3  4  

5 6 7 8

9 10 11 12

13 14 15 16

4 3 8

2 7 12

1 6 11 16

5 10 15

9 14

13

我們再來看看之前的分析思路:

1 首先看箭頭:方向為右下,根據陣列座標系原則,我們可以知道a[i][j]在每一輪內迴圈中都會自增.

只需要知道初始a[i][j]與結束a[i][j]時就可以開始迴圈了

2 對於右上角開始的對角線列印,我們按照逆時針的方向來看,先從n - 1 到 0 列,再從1 行到n行。

n - 1 到 0 列 起點座標為:a[0][k] 終點座標:a[n - 1 - k][n-1] i++,j++ k從n-1迴圈到0

1 到 n -1 行 起點座標為:a[k][0] 終點座標:a[n - 1][n-1 - k] i++,j++ k從1迴圈到n-1

類似的,如果我們是從左上角開始列印呢?那麼有如下的示意圖:

1 根據箭頭方向及陣列座標系,i++,j–

2 根據順時針來看,先是0到n-1列,再是1到n-1行

0到n-1列 起點座標a[0][k] 終點座標a[k][0] k從0迴圈到n-1

1 到n-1行 起點座標a[k][n-1] 終點座標a[n-1][k] k從1迴圈到n-1

那麼就有以下**

/**

* 左上角開始列印二維矩陣陣列,按照順時針方向來選取

*@param array

*/private

static

void

printtwodimensionalarraytopleft(int array)

//換行

logutil.println("");

}//再從1 到 n - 1 行

for (int k = 1 ; k <= n - 1; k++)

//換行

logutil.println("");

}logutil.println("");

}

輸出結果:

1  2  3  4  

5 6 7 8

9 10 11 12

13 14 15 16

1 2 5

3 6 9

4 7 10 13

8 11 14

12 15

16

特別的對於左下角,右下角,我們都有對應的方法分析:

左下角:

1 根據箭頭方向及陣列座標系,i++,j++

2 根據順時針來看,先是n-1行到0行,再是1到n-1列

n-1行到0行 起點座標a[k][0] 終點座標a[n-1][n-1-k] k從n-1迴圈到0

1 到n-1列 起點座標a[0][k] 終點座標a[n-1-k][n-1] k從1迴圈到n-1

**就不貼了

右下角:

1 根據箭頭方向及陣列座標系,i++,j–

2 根據逆時針來看,先是n-1到0行,再是n-2到0列

n-1到0行 起點座標a[k][n-1] 終點座標a[n-1][k] k從0迴圈到n-1

n-2到0列 起點座標a[0][k] 終點座標a[k][0] k從n-2迴圈到0

**就不貼了

最後:參考**

LeetCode二維陣列對角線遍歷

之前刷leetcode都是直接進題庫刷題,今天點開探索才發現還有這種模組化的入門教程,就開啟陣列與字串那塊開始學習。到二維陣列的時候,有一道練習題是這樣的 給定乙個含有 m x n 個元素的矩陣 m 行,n 列 請以對角線遍歷的順序返回這個矩陣中的所有元素,對角線遍歷如下圖所示。樣例輸入 1,2,3...

二維陣列主對角線與次對角線輸出 C語言

二維陣列主對角線與次對角線輸出 include include define n intmain putchar 10 printf 主對角線輸出 n 第一種方法 for int i 0 i 4 i 第二種方法 for int i 0 i 4 i printf 2d n arr i j 第三種方法 ...

矩陣二維陣列的對角線和

題目 求二維陣列方陣每行,每列,對角線元素之和。題解 注釋 include include int main 輸入ctrl z結束迴圈 int size 定義乙個變數用來確定矩陣的行列數!while scanf d size eof int array null 定義乙個二級指標,指向空。int i...