本文實例為大家分享了java順時針打印矩陣的具體代碼,供大家參考,具體內容如下
題目:
輸入一個矩陣,按照從外向里以順時針的順序依次打印出每一個數字。例如:如果輸入如下矩陣:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
則依次打印出數字1、2、3、4、8、12、16、15、14、13、9、5、6、7、11、10。
思路:
首先拿到這個題,讀完題我們腦子里會呈現出這樣的一個畫面。從外圈到內圈順序的依次打印,我們就可以把矩陣想象成若干個圈,如上圖所示,我們可以用一個循環來打印矩陣,每一次打印矩陣中的一個圈。那么循環結束的條件是什么?假設這個矩陣的行數是rows,列數是columns。打印第一圈的左上角的坐標是(0, 0),第二圈的左上角的坐標是(1, 1),依次類推。我們注意到左上角的坐標中行標和列標總是相同的,于是可以在矩陣中選取左上角為(start,start)的一圈作為我們的分析的目標。
對于一個5*5的矩陣,最后一圈只有一個數字,對應的坐標為(2, 2)。5 > 2 * 2;
對于一個6*6的矩陣,最后一圈有4個數字,其左上角的坐標仍是(2, 2)。6 > 2 *2;
故循環繼續的條件為columns > startx * 2并且rows > starty * 2。
打印一圈的實現可以分為4步:第一步從左到右打印一行,第二步從上到下打印一列,第三步從右到左打印一行,第四步從下到上打印一列(每一步根據起始坐標和終止坐標用一個循環就能打印出一行或者一列)。
注意:最后一圈可能退化成只有一行、只有一列,甚至只有一個數字,因此打印這樣的一圈就不再需要四步,可能只需要三步、兩步、一步。
接下來我們分析打印時每一步的前提條件。第一步總是需要的,因為打印一圈至少有一步。如果只有一行,那么就不用第二步了。即第二步的前提條件是終止行號大于起始行號。打印第三步的前提條件是圈內至少有兩行兩列。即除了要求終止行號大于起始行號外,還需要終止列號大于起始列號。同理打印第四步的前提條件是至少有三行兩列,即要求終止行號比起始行號至少大2,同時終止列號大于起始列號。
代碼實現:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
public arraylist<integer> printmatrixclockwisely( int [][]nums){ arraylist<integer> list = new arraylist<integer>(); int rows = nums.length; int cols = nums[ 0 ].length; if (nums == null || cols <= 0 || rows <= 0 ){ return null ; } int start = 0 ; while (cols > start* 2 && rows > start* 2 ){ printmatrixincircle(list, nums, cols, rows, start); ++start; } return list; } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
private void printmatrixincircle(arraylist<integer> list, int [][] nums, int cols, int rows, int start) { int endx = cols - 1 - start; int endy = rows - 1 - start; //從左到右打印一行 for ( int i = start; i <= endx; ++i) { int number = nums[start][i]; list.add(number); } //從上到下打印一列 if (start < endy){ for ( int i = start + 1 ; i <= endy; ++i) { int number = nums[i][endx]; list.add(number); } } //從右向左打印一行 if (start < endx && start < endy){ for ( int i = endx- 1 ; i >= start; --i) { int number = nums[endy][i]; list.add(number); } } //從下向上打印一列 if (start < endx && start < endy - 1 ){ for ( int i = endy- 1 ; i >= start + 1 ; --i) { int number = nums[i][start]; list.add(number); } } } |
小結:
在二維數組中遍歷的一種方式,考查我們對規律的總結
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:https://blog.csdn.net/u013132035/article/details/80594659