找规律题目 旋转矩阵相关

339 阅读1分钟

题目

给定一个n*n的二维矩阵matrix 表示一个图像。请你将图像顺时针旋转90度。必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。不要使用另一个矩阵来旋转图像

image.png

  • 比如通过最外层左上角坐标和右下角坐标,即可得到最外层每个点的转换规律,当最外层转换完毕后,左上角和右下角均-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打印的顺序如图所示

c986997d76f133067df005011ba59bba.png

遍历思路:

a5a6648f8ff84d8d65582e41f73611f8.png

-通过两个坐标的直线连线进行遍历,必入(0,1)和(1,0)、(0,2),(2,0),并且每次遍历方向和上次相反,如果有一边到底了如y方向到底了,则坐标向x方向+1,x方向到底了,则坐标向y方向+1,继续两点间遍历

题目

将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。比如输入字符串为 "PAYPALISHIRING" 行数为3时,排列如下:

image.png

之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"。 再比如行数为5时,排列如下:

1d3b22e6064e3ad17923e4d04d92c9fa.png

  • 每行规律: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;
}