Java 题解 | #向左移动牛群II#
向左移动牛群II
https://www.nowcoder.com/practice/2467ddd80a2942abbaa752f3c874dd79
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param n int整型 * @param k int整型 * @return int整型二维数组 */ public int[][] rotateII (int n, int k) { // write code here int[][] pp = new int[n][n]; int[] p = new int[n]; for (int i = 0, cnt = 0; i < n; i++) { p[i] = n; pp[i] = new int[n]; for (int j = 0; j < n; j++) pp[i][j] = ++cnt; } int num = k % n; if (num == 0) { return pp; } for (int kk = 0; kk < num; kk++) { for (int i = 0; i < n; i++) { int tmp = pp[i][0]; for (int j = 0; j < n - 1; j++) pp[i][j] = pp[i][j + 1]; pp[i][n - 1] = tmp; } for (int i = 0; i < n; i++) { int tmp = pp[0][i]; for (int j = 0; j < n - 1; j++) pp[j][i] = pp[j + 1][i]; pp[n - 1][i] = tmp; } } return pp; } }
该代码使用的编程语言Java。
该题考察的知识点是数组的旋转和二维数组的操作。题目要求将一个n x n的二维数组顺时针旋转k次,并返回旋转后的结果。
具体代码解释如下:
- 使用嵌套循环初始化二维数组pp。外层循环遍历行,内层循环遍历列。同时,使用一个计数器cnt来记录当前要填充的值,每次填充之后cnt增加1。
- 计算旋转次数num,即k除以n取余数。如果num为0,则表示没有旋转操作,直接返回原始的二维数组pp。
- 如果num不为0,则进行旋转操作。外层循环控制旋转的次数,内层循环分别旋转行和列。
- 行旋转:首先将每一行的第一个元素保存到临时变量tmp中,然后将该行的每个元素向左移动一个位置,最后将临时变量tmp放置在该行的最后一个位置。
- 列旋转:首先将每一列的第一个元素保存到临时变量tmp中,然后将该列的每个元素向上移动一个位置,最后将临时变量tmp放置在该列的最后一个位置。
- 循环结束后,将结果返回。将n赋值给returnSize,p赋值给returnColumnSizes,并返回二维数组pp。