题目
给定一个n*n的二维矩阵matrix 表示一个图像。请你将图像顺时针旋转90度。必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。不要使用另一个矩阵来旋转图像
- 比如通过最外层左上角坐标和右下角坐标,即可得到最外层每个点的转换规律,当最外层转换完毕后,左上角和右下角均-1,继续遍历内层的圈,直到每一圈都遍历完毕
function rotate(matrix) {
// 左上角坐标
const a = 0,
b = 0;
// 右下角坐标
const c = matrix.length - 1,
d = matrix[0].length - 1;
// 每圈遍历完后缩减一圈继续遍历
while (a < c) {
rotateEdge(matrix, a++, b++, c--, d--);
}
function rotateEdge(matrix, a, b, c, d) {
const tmp = 0;
// 每次交换四个边上对应点的位置
for (let i = 0; i < d - b; i++) {
tmp = m[a][b + i];
m[a][b + i] = m[c - i][b];
m[c - i][b] = m[c][d - i];
m[c][d - i] = m[a + i][d];
m[a + i][d] = tmp;
}
}
}
题目
给定一个二维数组matrix请用ZigZag的方式打印矩阵所有的值,ZigZag打印的顺序如图所示
遍历思路:
-通过两个坐标的直线连线进行遍历,必入(0,1)和(1,0)、(0,2),(2,0),并且每次遍历方向和上次相反,如果有一边到底了如y方向到底了,则坐标向x方向+1,x方向到底了,则坐标向y方向+1,继续两点间遍历
题目
将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。比如输入字符串为 "PAYPALISHIRING" 行数为3时,排列如下:
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"。 再比如行数为5时,排列如下:
- 每行规律:2*n-2,得到重复周期为8
- 中间斜线规律:n倍的周期-行号
function convert(s, row) {
const n = s.length;
// 极限情况只有一行或者行数大于字符串长度,得到的结果为原样输出
if (row == 1 || row >= n) {
return s;
}
const t = 2 * (row - 1);
const ans = [];
const fill = 0;
for (let i = 0; i < row; i++) {
//来到i行,原始串开始下标j==i
for (let j = i, nextColTop = t; j < n; j += t, nextColTop += t) {
// 处理每行
ans[fill++] = s[j];
// 处理中间斜线
if (i >= 1 && i <= row - 2 && nextColTop - i < n) {
ans[fill++] = s[nextColTop - i];
}
}
}
return ans;
}