咸陽做網站開發(fā)公司哪家好創(chuàng)建網站
1.題目
2.思路
(借用代碼隨想錄的圖)
1.我們將轉一圈看作一個循環(huán)(1->2->3->4->5->6->7->8 這是一個循環(huán))
2.在這個循環(huán)里,我們要畫四條邊(上右下左)
填充上行從左到右
填充右列從上到下
填充下行從右到左
填充左列從下到上
3.因為畫這四條邊,有重復元素,我們?yōu)榱私y(tǒng)一處理拐角處元素的規(guī)則,規(guī)定拐角處都讓給新的一條邊,就是上圖不同顏色的邊
4. 這樣就有兩個循環(huán)了(第一個循環(huán)表示要繪制多少個四條邊,第二個循環(huán)里繪制四條邊)
3.實施細節(jié)
1.在畫每一條邊的時候,我們首先考慮到的第一個問題是:怎么把數(shù)寫到對應位置去?
解決:設置一個遍歷參數(shù),表示當前的位置
ori_i (表示當前位置的橫坐標), ori_j(表示當前位置的列坐標)
res[ori_i][ori_j]= num;
2.接下來會遇到:什么時候該畫下一條邊?
解決:設置邊界參數(shù),按3*3矩陣舉例
col_max=2(列最大邊界)col_min=0(列最小邊界)
row_max=2(行最大邊界) row_min=0
拿上行從左到右舉例:當遍歷參數(shù)ori_j <= col_max 時畫這條邊
其他三條邊類推
3 畫完這四條邊后,就該進入到下一個循環(huán)了,該繼續(xù)畫下一個四條邊了。這時候我們要設置開始繪制的起點。通過一個start參數(shù)來設置每次循環(huán)的起點
4 要注意當n=奇數(shù)的時候,最后最中間會只留下一個小塊,這個時候我們規(guī)定這四條邊都不繪制中間的小塊,我們跳出循環(huán),單獨給這個小塊賦值!
5 怎樣判斷繪制結束?
解決:當row_min>= row_max 時結束!
注意這里是大于等于 因為當row_min=row_max的時候表示只剩下中間一個小塊了,而根據(jù)4.的規(guī)定,中間小塊我們要跳出循環(huán)來單獨賦值
4.Java代碼實現(xiàn)
class Solution {public int[][] generateMatrix(int n) {int[][] res = new int[n][n];int start = 0; //定義初始點//定義邊界int row_max = n - 1;int col_max = n - 1;int row_min = 0;int col_min = 0;int num = 1; //定義要寫的數(shù)while (row_max > row_min) {int ori_i = start;int ori_j = start;//上側從左到右for (; ori_j <= col_max - 1; ori_j++) {res[ori_i][ori_j] = num;num++;}//右側從上到下for (; ori_i <= row_max - 1; ori_i++) {res[ori_i][ori_j] = num;num++;}//下側從右往左for (; ori_j >= col_min + 1; ori_j--) {res[ori_i][ori_j] = num;num++;}//左側從下往上for (; ori_i >= row_min + 1; ori_i--) {res[ori_i][ori_j] = num;num++;}//更新邊界row_max--;col_max--;row_min++;col_min++;//更新初始點start++;}//如果是奇數(shù),需要給最中間的單獨賦值if (n % 2 == 1) {res[start][start] = num;}return res;}
}