美文网首页
Java回形数组

Java回形数组

作者: 九里 | 来源:发表于2020-07-29 17:31 被阅读0次

最近遇到一个面试题。

给定一个数字n,输出一个n阶矩阵。矩阵中的元素为1到n²。按回形排列
eg1 :

输入:n=2
输出:
1 2
4 3

eg2:

输入:n=3
输出:
1 2 3
8 9 4
7 6 5

思路:

这个题属于现实中遇到很简单,但是程序实现还是有些难度的问题。
面试的时候面试官让我手写出这个问题的解法,无奈最后实在没写出来。纸上写代码太难了。
这个问题其实需要分成三个层次去看。
第一层看出来,此问题需要一个二维数组解决
第二层看出来,此问题一个有四种操作数组的情况
第三层看出来,此问题可以按层次操作。
明白这三层思路,那就能解决问题了。但是还是有几个边界问题需要处理

1. 如何划分四种操作的操作范围

这个问题其实看你的习惯,我这里是按平均分配的原则分配给了四次操作。每次操作处理n-1-当前层数

image.png

2. n为奇数的时候,最内层只有一个元素。此时按下面方法无法被处理。因此如果n为奇数时直接将最内层的填充为n*n

代码

public class Solution {
    /**
     * 二维数组输出工具
     *
     * @param arr    二维数据
     * @param length 补齐长度
     */
    static void print(int[][] arr, int length) {
        for (int[] ints : arr) {
            for (int anInt : ints) {
                System.out.print(getLengthSpace(anInt, length));
            }
            System.out.println();
        }
    }

    /**
     * 补齐空格工具类
     *
     * @param num    元素
     * @param length 补齐的长度
     * @return 补齐之后的元素
     */
    static String getLengthSpace(int num, int length) {
        StringBuilder result = new StringBuilder(String.valueOf(num));
        int size = length - result.length() + 1;
        for (int i = 0; i < size; i++) {
            result.append(" ");
        }
        return result.toString();
    }

    public static void main(String[] args) {
        print(fun(100), 5);
    }

    /**
     * 回形数组构建
     *
     * @param n 阶数
     * @return n阶数组
     */
    static int[][] fun(int n) {
        int[][] arr = new int[n][n];
        int start = 1;
        //当前构建的层数,默认为0
        int layer = 0;
        //如果n为偶数则遍历n/2此,若n为奇数则需要遍历n/2+1次。
        for (int i = 0; i < (n / 2 + n % 2); i++) {
            //水平向右填充
            for (int first = layer; first < n - 1 - layer; first++) {
                arr[layer][first] = start++;
            }
            //垂直向下填充
            for (int second = layer; second < n - 1 - layer; second++) {
                arr[second][n - layer - 1] = start++;
            }
            //水平向左填充
            for (int third = n - layer - 1; third > layer; third--) {
                arr[n - layer - 1][third] = start++;
            }
            //垂直向上填充
            for (int forth = n - layer - 1; forth > layer; forth--) {
                arr[forth][layer] = start++;
            }
            //进行下一层遍历
            ++layer;
        }
        //n为奇数的时候,数组最中间的元素无法被填写。因此手动填充为n*n
        if (n % 2 != 0) {
            int mid = n >> 1;
            arr[mid][mid] = n * n;
        }
        return arr;
    }
}

相关文章

  • Java回形数组

    最近遇到一个面试题。 给定一个数字n,输出一个n阶矩阵。矩阵中的元素为1到n²。按回形排列eg1 : 输入:n=2...

  • Java静态方法和实例方法 java中的数组作为形参传入

    Java静态方法和实例方法 java中的数组作为形参传入 Java虚拟机启动一个Java程序的时候,会诞生一个虚拟...

  • Android NDK - JNI 回调Java函数注意事项

    被回调的Java静态函数中有数组参数 假设有如下Java函数待被JNI调用,但是由于Cpp中的数组和java中的数...

  • Java中的···可变长参数

    Java1.5引入。"…"必须是方法的最后一个形参,表示多个(0,1,2,…)参数,类似数组参数,使用数组传实参。...

  • 回形打印二维数组

    一、问题描述 输入两个数字 行数和列数,回形打印出一个二维数组,大小按回形的方向依次递增。 二、解题思路 顺着数字...

  • 【骚全带你学Java---九、认识java数组】

    java中数组 数组是指一组数据的集合,数组中的每个数据称为元素。在Java中,数组也是Java对象。数组中的元素...

  • JAVA 基本功秘籍

    1. Java数组与内存控制一、Java数组初始化 Java数组是静态的,即当数组被初始化之后,该数组的长度是不可...

  • Java数组

    Java数组 1.声明数组 在java中声明数组有两种形式:数组元素类型名[] 数组名;数组元素类型名 数组名 [...

  • Java知识之数组

    Java数组知识图如下: 数组基本用法 声明数组声明数组语法格式: 初始化数组Java中使用关键字new创建数组对...

  • C语言数组指针

    总:如果编写的函数需要修改数组,在声明数组形参的不使用const;如果编写的函数不用修改数组,那么在声明数组形参时...

网友评论

      本文标题:Java回形数组

      本文链接:https://www.haomeiwen.com/subject/upfkrktx.html