华为OD机试D卷-螺旋矩阵填数(100分)JAVA

做题思路:螺旋矩阵遍历,不懂的可以去学习下怎么螺旋遍历二维数组,套公式就可以了。

定义四个边界,边界会在遍历的过程中收缩。

代码如下:

import java.util.Arrays;
import java.util.Scanner;

/**
 * 螺旋矩阵填数
 */
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt(); //数字个数
        int m = in.nextInt(); //矩阵行数
        int column = 0;
        if (n % m != 0) {
            column = n / m + 1;
        } else column = n / m;
        String[][] matrix = new String[m][column];
        for (String[] row : matrix) {
            Arrays.fill(row, "*");
        }
        solveMatrix(matrix, n);
        for (String[] row : matrix) {
            System.out.println(String.join(" ", row));
        }
    }

    private static void solveMatrix(String[][] matrix, int n) {
        //定义四个边界
        int l = 0, r = matrix[0].length - 1, t = 0, b = matrix.length - 1;
        int x = 1;
        while (true) {
            //从左往右遍历,赋值
            for (int i = l; i <= r; i++) {
                if (x <= n) {
                    matrix[t][i] = Integer.toString(x++);
                }
            }
            if (++t > b) break;//收缩上边界
            //从上往下遍历,赋值
            for (int i = t; i <= b; i++) {
                if (x <= n) {
                    matrix[i][r] = Integer.toString(x++);
                }
            }
            if (--r < l) break; //收缩右边界
            //从右往左遍历,赋值
            for (int i = r; i >= l; i--) {
                if (x <= n) {
                    matrix[b][i] = Integer.toString(x++);
                }
            }
            if (--b < t) break;//收缩下边界
            //从下往上遍历,赋值
            for (int i = b; i >= t; i--) {
                if (x <= n) {
                    matrix[i][l] = Integer.toString(x++);
                }
            }
            if (++l > r) break;//收缩左边界
        }
    }
}

全部评论

相关推荐

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