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