如何修改TypeScript二维数组旋转函数实现逆时针旋转?
解决思路与代码实现
你的顺时针函数核心是按「环」处理二维数组的元素循环移动,要实现逆时针循环移动一格,需要调整每个边及四个角元素的移动方向,以下是修正后的逆时针旋转函数:
function rotateCounterClockwise<T>(arr: T[][]) { const ret: any[][] = arr.map(c => c.map(v => "")); // 创建空的结果数组 const rows = arr.length; if (rows === 0) return ret; const cols = arr[0].length; if (!arr.every(l => l.length === cols)) throw new Error("Not rectangular"); const stationaryRing = (rows % 2 !== 0) && (cols % 2 !== 0) ? (Math.min(rows, cols) - 1)/2:-1; for (let r = 0; r < rows; r++) { const nr = rows - 1 - r; for (let c = 0; c < cols; c++) { const nc = cols - 1 - c; const ring = Math.min(r, nr, c, nc); let [rNew, cNew] = [r, c]; if (ring !== stationaryRing) { // 顶行非左角元素:向左移动一格 if (r === ring && c > ring) { cNew = c - 1; } // 右列非底角元素:向上移动一格 else if (c === cols - 1 - ring && r < rows - 1 - ring) { rNew = r - 1; } // 底行非右角元素:向右移动一格 else if (r === rows - 1 - ring && c < cols - 1 - ring) { cNew = c + 1; } // 左列非顶角元素:向下移动一格 else if (c === ring && r > ring) { rNew = r + 1; } // 左上角:向下移动一格 else if (r === ring && c === ring) { rNew = r + 1; } // 右上角:向左移动一格 else if (r === ring && c === cols - 1 - ring) { cNew = c - 1; } // 右下角:向上移动一格 else if (r === rows - 1 - ring && c === cols - 1 - ring) { rNew = r - 1; } // 左下角:向右移动一格 else if (r === rows - 1 - ring && c === ring) { cNew = c + 1; } } ret[rNew][cNew] = arr[r][c]; } } return ret; }
关键修改说明
原顺时针函数是让每个元素向顺时针方向循环移动一格,逆时针则需要完全反转移动逻辑:
- 顶行元素:从「向右移」改为「向左移」(左角单独处理为向下移)
- 右列元素:从「向下移」改为「向上移」(底角单独处理为向上移)
- 底行元素:从「向左移」改为「向右移」(右角单独处理为向上移)
- 左列元素:从「向上移」改为「向下移」(顶角单独处理为向下移)
- 四个角的元素单独判断,避免出现索引越界问题
测试验证
输入3x3数组:
1 2 3 4 5 6 7 8 9
函数输出与预期完全一致:
2 3 6 1 5 9 4 7 8
内容的提问来源于stack exchange,提问作者Tamir Myblat
相关产品推荐
相关产品推荐

