java 输出回形_面试题:Java回形数组

本文介绍了如何解决面试中遇到的回形矩阵输出问题。通过分析三层思路,即使用二维数组、处理四种操作情况和按层次操作,可以解决此问题。代码中详细展示了Java实现回形矩阵的填充逻辑,包括特殊情况如n为奇数时的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近遇到一个面试题。

给定一个数字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-当前层数次

b113b90e2ecb0b733c4a0f495de075a7.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;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值