每日一道算法Day28--二维数组的旋转

383 阅读1分钟

题目描述

image.png

大致思路:

  1. 将二维数组以中轴线对称

举个栗子:

 5  1  9  11         11  9  1  5       
 2  4  8  10    ==>  10  8  4  2   
 13 3  6  7          7   6  3  13  
 15 14 12 16         16  12 14 15     
  1. 将第一步得到的数组以右上角到坐下角为对称轴对称
 11  9  1  5         15  13  2  5
 10  8  4  2    ==>  14  3   4  1
 7   6  3  13        12  6   8  9
 16  12 14 15        16  7   10 11

第二步得到的数组即为最后结果。

代码如下:

function rotateArr(matrix: number[][]): void {
  const len = matrix.length;
  
  //中轴线对称
  for (let i = 0; i < len; ++i) {
    for (let j = 0; j <= Math.floor((len - 1) / 2); ++j) {
      [matrix[i][j], matrix[i][len - j - 1]] = [matrix[i][len - j - 1], matrix[i][j]];
    }
  }
  
  //右上角到坐下角为对称轴对称
  let count = 1;
  let index = len - 1;
  for (let j = 0; j < len - 1 && index >= 0; ++j) {
    let m = index - 1;
    let n = count++;
    while (m >= 0 && n < len) {
      console.log(matrix[j][m], matrix[n][len - j - 1]);
      [matrix[j][m], matrix[n][len - j - 1]] = [matrix[n][len - j - 1], matrix[j][m]];
      m--;
      n++;
    }
    index--;
  }
}