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次,并返回旋转后的结果。

具体代码解释如下:

  1. 使用嵌套循环初始化二维数组pp。外层循环遍历行,内层循环遍历列。同时,使用一个计数器cnt来记录当前要填充的值,每次填充之后cnt增加1。
  2. 计算旋转次数num,即k除以n取余数。如果num为0,则表示没有旋转操作,直接返回原始的二维数组pp。
  3. 如果num不为0,则进行旋转操作。外层循环控制旋转的次数,内层循环分别旋转行和列。
  4. 行旋转:首先将每一行的第一个元素保存到临时变量tmp中,然后将该行的每个元素向左移动一个位置,最后将临时变量tmp放置在该行的最后一个位置。
  5. 列旋转:首先将每一列的第一个元素保存到临时变量tmp中,然后将该列的每个元素向上移动一个位置,最后将临时变量tmp放置在该列的最后一个位置。
  6. 循环结束后,将结果返回。将n赋值给returnSize,p赋值给returnColumnSizes,并返回二维数组pp。
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务