本文實(shí)例為大家分享了java順時(shí)針打印矩陣的具體代碼,供大家參考,具體內(nèi)容如下
題目:
輸入一個(gè)矩陣,按照從外向里以順時(shí)針的順序依次打印出每一個(gè)數(shù)字。例如:如果輸入如下矩陣:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
則依次打印出數(shù)字1、2、3、4、8、12、16、15、14、13、9、5、6、7、11、10。
思路:
首先拿到這個(gè)題,讀完題我們腦子里會(huì)呈現(xiàn)出這樣的一個(gè)畫面。從外圈到內(nèi)圈順序的依次打印,我們就可以把矩陣想象成若干個(gè)圈,如上圖所示,我們可以用一個(gè)循環(huán)來打印矩陣,每一次打印矩陣中的一個(gè)圈。那么循環(huán)結(jié)束的條件是什么?假設(shè)這個(gè)矩陣的行數(shù)是rows,列數(shù)是columns。打印第一圈的左上角的坐標(biāo)是(0, 0),第二圈的左上角的坐標(biāo)是(1, 1),依次類推。我們注意到左上角的坐標(biāo)中行標(biāo)和列標(biāo)總是相同的,于是可以在矩陣中選取左上角為(start,start)的一圈作為我們的分析的目標(biāo)。
對(duì)于一個(gè)5*5的矩陣,最后一圈只有一個(gè)數(shù)字,對(duì)應(yīng)的坐標(biāo)為(2, 2)。5 > 2 * 2;
對(duì)于一個(gè)6*6的矩陣,最后一圈有4個(gè)數(shù)字,其左上角的坐標(biāo)仍是(2, 2)。6 > 2 *2;
故循環(huán)繼續(xù)的條件為columns > startx * 2并且rows > starty * 2。
打印一圈的實(shí)現(xiàn)可以分為4步:第一步從左到右打印一行,第二步從上到下打印一列,第三步從右到左打印一行,第四步從下到上打印一列(每一步根據(jù)起始坐標(biāo)和終止坐標(biāo)用一個(gè)循環(huán)就能打印出一行或者一列)。
注意:最后一圈可能退化成只有一行、只有一列,甚至只有一個(gè)數(shù)字,因此打印這樣的一圈就不再需要四步,可能只需要三步、兩步、一步。
接下來我們分析打印時(shí)每一步的前提條件。第一步總是需要的,因?yàn)榇蛴∫蝗χ辽儆幸徊健H绻挥幸恍校敲淳筒挥玫诙搅恕<吹诙降那疤釛l件是終止行號(hào)大于起始行號(hào)。打印第三步的前提條件是圈內(nèi)至少有兩行兩列。即除了要求終止行號(hào)大于起始行號(hào)外,還需要終止列號(hào)大于起始列號(hào)。同理打印第四步的前提條件是至少有三行兩列,即要求終止行號(hào)比起始行號(hào)至少大2,同時(shí)終止列號(hào)大于起始列號(hào)。
代碼實(shí)現(xiàn):
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); } } } |
小結(jié):
在二維數(shù)組中遍歷的一種方式,考查我們對(duì)規(guī)律的總結(jié)
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。
原文鏈接:https://blog.csdn.net/u013132035/article/details/80594659