成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

我們一起聊聊順時(shí)針打印矩陣

開(kāi)發(fā) 前端
有一個(gè)矩陣,如何按照從外向里以順時(shí)針的順序依次打印出每一個(gè)元素?本文將跟大家分享下這個(gè)算法。

梳理思路

當(dāng)我們遇到一個(gè)復(fù)雜的問(wèn)題時(shí),可以通過(guò)舉例將它畫(huà)出來(lái),這樣就可以更直觀的發(fā)現(xiàn)規(guī)律。那么我們就先構(gòu)造一個(gè)矩陣出來(lái),如下所示:

const matrix = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 16]
];

順時(shí)針訪問(wèn)一個(gè)矩陣,那么它的訪問(wèn)過(guò)程就如下圖所示:

圖片

觀察上圖后,我們可以很明顯的知道可以通過(guò)一個(gè)循環(huán)來(lái)打印這個(gè)矩陣,每次打印矩陣的一個(gè)圈,那么循環(huán)的終止條件是什么呢?

接下來(lái),我們就來(lái)分析下循環(huán)的終止條件。假設(shè)矩陣的行數(shù)為rows,列數(shù)為cols,打印第一圈的左上角坐標(biāo)是(0,0),第二圈的左上角坐標(biāo)是(1,1),以此類(lèi)推,我們注意到左上角的坐標(biāo)中,行標(biāo)與列標(biāo)總是相同的,于是可以在矩陣中選取左上角為(start,start)的一圈作為我們的分析目標(biāo)。

圖片

我們?cè)賮?lái)多列舉幾個(gè)例子觀察下,例如:

  • 對(duì)于5*5的矩陣而言,最后一圈只有1個(gè)數(shù)字,對(duì)應(yīng)的坐標(biāo)為(2,2)
  • 對(duì)于6*6的矩陣而言,最后一圈有4個(gè)數(shù)字,其左上角的坐標(biāo)依然為(2,2)

圖片

據(jù)上所述,我們可以發(fā)現(xiàn):5 > 2 * 2、6 > 2 * 2?全部成立,于是可以得出讓循環(huán)終止的條件為:cols > start * 2 && rows > start * 2。

接下來(lái),我們來(lái)分析下如何實(shí)現(xiàn)打印一圈,前面的分析中我們已經(jīng)知道了打印1圈需要4步,即:

  • 從左到右打印一行
  • 從上到下打印一列
  • 從右到左打印一行
  • 從下到上打印一列

每一步我們根據(jù)起始坐標(biāo)和終止坐標(biāo)用一個(gè)循環(huán)就能打印出一行或者一列,但是最后一圈有可能退化成只有一行、只有一列,甚至只有一個(gè)數(shù)字,因此打印這樣的一圈就不再需要四步。可能只需要三步、兩步甚至一步。

我們來(lái)分析下每一步的執(zhí)行條件:

  • 第一步是必須的,因?yàn)榇蛴∫蝗χ辽儆幸徊?/li>

start作為行坐標(biāo)

從start位置開(kāi)始遍歷至終止列號(hào),將其作為列坐標(biāo)

輸出每一個(gè)元素

圖片

  • 第二步要求圈內(nèi)至少有2行,即:終止行號(hào)大于起始行號(hào)

從start+1位置遍歷至至終止行號(hào),將其作為行坐標(biāo)

終止列號(hào)作為列坐標(biāo)

輸出每一個(gè)元素

圖片

  • 第三步要求圈內(nèi)至少有兩行兩列,即:終止行號(hào)大于起始行號(hào)且終止列號(hào)大于起始列號(hào)

從終止列號(hào)-1位置遍歷至start,將其作為列坐標(biāo)

終止行號(hào)作為行坐標(biāo)

輸出每一個(gè)元素

圖片

  • 第四步要求圈內(nèi)至少有三行兩列,即:終止行號(hào)比起始行號(hào)至少大2,同時(shí)終止列號(hào)大于起始列號(hào)

從終止行號(hào)-1位置遍歷至start+1位置,將其作為行坐標(biāo)

start作為列坐標(biāo)

輸出每一個(gè)元素

圖片

實(shí)現(xiàn)代碼

經(jīng)過(guò)上面的分析,我們已經(jīng)有了縝密的邏輯,接下來(lái)我們就可以愉快地進(jìn)行編碼了,如下所示:

// 順時(shí)針打印矩陣
export function PrintMatrix<T>(
matrix: Array<Array<T>>,
cols: number,
rows: number
): void {
if (matrix == null || cols == null || rows == null) return;
// 圈數(shù)
let start = 0;
while (cols > start * 2 && rows > start * 2) {
// 打印每一圈的數(shù)據(jù)
PrintMatrixInCircle(matrix, cols, rows, start);
start++;
}
}

// 打印矩陣的一圈
function PrintMatrixInCircle<T>(
matrix: Array<Array<T>>,
cols: number,
rows: number,
start: number
): void {
// 計(jì)算當(dāng)前圈結(jié)束點(diǎn)坐標(biāo)(索引從0開(kāi)始,所以需要-1)
// 終止列號(hào)
const endX = cols - 1 - start;
// 終止行號(hào)
const endY = rows - 1 - start;
// 從左到右打印一行
for (let i = start; i <= endX; i++) {
console.log(matrix[start][i]);
}

// 從上到下打印一列
if (start < endY) {
// 此時(shí):
// 最后一列已經(jīng)在從左到右的打印中讀取了
for (let i = start + 1; i <= endY; i++) {
console.log(matrix[i][endX]);
}
}

// 從右到左打印一行
if (start < endX && start < endY) {
// 此時(shí):
// 最后一列已經(jīng)在從上到下的打印中讀取了
for (let i = endX - 1; i >= start; i--) {
console.log(matrix[endY][i]);
}
}

// 從下到上打印一列
if (start < endX && start < endY - 1) {
// 此時(shí):
// 最后一列已經(jīng)在從上到下的打印中讀取了
// 第一列的打印已經(jīng)在從左到右的打印中讀取了
for (let i = endY - 1; i >= start + 1; i--) {
console.log(matrix[i][start]);
}
}
}

我們用前面所舉的例子來(lái)驗(yàn)證下上述代碼能否正常執(zhí)行,如下所示:

const matrix = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 16]
];

PrintMatrix(matrix, 4, 4);

示例代碼

本文所用代碼完整版請(qǐng)移步:

  • PrintMatrix.ts
  • printMatrix-test.ts
責(zé)任編輯:武曉燕 來(lái)源: 神奇的程序員
相關(guān)推薦

2021-11-30 14:10:32

順時(shí)針打印矩陣

2024-02-20 21:34:16

循環(huán)GolangGo

2021-08-27 07:06:10

IOJava抽象

2023-08-10 08:28:46

網(wǎng)絡(luò)編程通信

2023-08-04 08:20:56

DockerfileDocker工具

2023-06-30 08:18:51

敏捷開(kāi)發(fā)模式

2022-05-24 08:21:16

數(shù)據(jù)安全API

2023-09-10 21:42:31

2022-10-28 07:27:17

Netty異步Future

2022-11-12 12:33:38

CSS預(yù)處理器Sass

2022-02-14 07:03:31

網(wǎng)站安全MFA

2022-01-04 12:08:46

設(shè)計(jì)接口

2022-06-26 09:40:55

Django框架服務(wù)

2023-04-26 07:30:00

promptUI非結(jié)構(gòu)化

2022-04-06 08:23:57

指針函數(shù)代碼

2023-12-28 09:55:08

隊(duì)列數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)

2025-03-27 02:00:00

SPIJava接口

2023-07-27 07:46:51

SAFe團(tuán)隊(duì)測(cè)試

2022-07-29 08:17:46

Java對(duì)象內(nèi)存

2024-02-26 00:00:00

Go性能工具
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 欧美精品一区三区 | 日日射影院 | 国产精品久久久久久久久久免费看 | 国产三级电影网站 | 精品欧美一区二区三区久久久 | 久青草影院 | 久久国产精品一区二区 | 亚洲伊人久久综合 | 黄网站免费在线看 | 欧美性高潮 | 日本淫视频| 国产精品一区二区欧美黑人喷潮水 | wwwxxx日本在线观看 | 欧美一区二区三区免费电影 | aaaaaa大片免费看最大的 | 在线观看国产三级 | 亚洲一二三区在线观看 | 一级黄色生活视频 | 久久精品小视频 | gav成人免费播放视频 | 一区二区三区四区在线 | 欧美精品综合在线 | 91影院在线观看 | 国产一二区免费视频 | 欧美一级欧美三级在线观看 | 男人天堂视频在线观看 | 欧美午夜一区 | 久热免费在线 | 精品国产精品一区二区夜夜嗨 | 国产精品国产成人国产三级 | 91网视频| 97久久精品午夜一区二区 | 久久久www成人免费无遮挡大片 | 成人福利电影 | 日韩 国产 在线 | 亚洲精品一区二区三区中文字幕 | 久久99精品国产麻豆婷婷 | 成年人免费看的视频 | 一区二区免费 | 毛片黄 | 国产综合在线视频 |