题解 | #顺时针打印矩阵(JS)#
顺时针打印矩阵
http://www.nowcoder.com/practice/9b4c81a02cd34f76be2659fa0d54342a
思路
首先明确题意,就是从第一个元素开始顺时针访问矩阵。
我的思路是设置好边界,记录当前坐标(从[0,0]
开始),每次碰到边界就改变方向,同时也要修改边界。
为了让这些操作同步,用一个now
变量来记录当前的下标,无论是方向还是比较的边界(实际我们可以看到每次只向一个方向走,只需要判断该方向对应的边界即可)。
我是按照的右、下、左、上来设置的,但是我发现进行比较和需要修改的边界并不是同一个,比如一开始是往右走,碰壁了之后需要修改的是“上”这个方向的边界。因此我进行了位移对应过去也很容易。
我的思路和官方下面那位大哥的java代码的思路类似,结合代码来理解吧。
代码
function printMatrix(matrix) { // write code here let ans = []; if(!matrix) return ans; let m = matrix.length; let n = matrix[0].length; if (m === 0 || n === 0) return ans; if (m === 1) return matrix[0]; // 一行 if (n === 1) { // 一列 for (let i = 0; i < m; i++) { ans.push(matrix[i][0]); } return ans; } let boundary = [n - 1, m - 1, 0, 0]; // 右下左上的边界 let change = [-1, -1, 1, 1]; // 上面的边界对应的修改值 let dir = [[0, 1],[1, 0],[0, -1],[-1, 0]]; // 右下左上方向移动的x、y值 let now = 0; // 当前方向下标 let nx = 0, ny = 0; // 当前坐标 for (let i = 0; i < m * n; i++) { ans.push(matrix[nx][ny]); // 按照给定方向移动 nx += dir[now][0]; ny += dir[now][1]; // 如果是0或2,则需要与边界对比的是x坐标,否则是y坐标 if ((now % 2 === 0 && ny === boundary[now]) || (now % 2 !== 0 && nx === boundary[now])) { // 触碰边界,对边界进行修正,再修改方向 let cnow = (now + 3) % 4; boundary[cnow] += change[cnow]; now = (now + 1) % 4; } } return ans } module.exports = { printMatrix : printMatrix };