您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關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,同時終止列號大于起始列號。
代碼實現:
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; }
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); } } }
上述就是小編為大家分享的Java中怎么順時針打印矩陣了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。