今天看到一道面试题,打印螺旋数组,具体打印结果如下图所示:
之后使用java代码实现了一下,具体代码如下所示。
package test;
public class PrintTest {
public static void main(String[] args) {
PrintTest a = new PrintTest(5,9);
int[][] result = a.fun();
for(int i = 0; i < result.length; i ++){
for (int j = 0; j < result[i].length; j++) {
System.out.print(result[i][j] + " ");
}
System.out.println();
}
}
PrintTest(int width, int leng){
this.leng = leng;
this.width = width;
this.array = new int[width][leng];
}
int leng;//要打印的矩形的长度
int width;//要打印的矩形的宽度
int currentValue = 1;//当前要填的数字
boolean xIsAdd = true;//判断x增还是减
boolean yIsAdd = true;//判断y增还是减
boolean circleX = true;//是否循环X
int[][] array;//创建的数组
int x = 0;//当前数字放的位置
int y = 0;
public int[][] fun() {
if (currentValue > width * leng) {
return array;
}
if (circleX) {
//循环x
if (xIsAdd) {
//x循环增加
for (; x < leng && array[y][x] == 0;x++) {
array[y][x] = currentValue;
currentValue++;
}
xIsAdd = false;//循环结束后将x循环增加置为循环减少
circleX = false;//下次循环y
x--;
y++;
return fun();
}else {
//x循环减少
for (; x >= 0 && array[y][x] == 0; x--) {
array[y][x] = currentValue;
currentValue++;
}
xIsAdd = true;//循环结束后将x循环减少置为循环增加
circleX = false;//下次循环y
x++;
y--;
return fun();
}
}else {
//循环y
if (yIsAdd) {
//y增加循环
for (; y < width && array[y][x] == 0; y++) {
array[y][x] = currentValue;
currentValue++;
}
yIsAdd = false;//循环结束后将y循环增加置为循环减少
circleX = true;//下次循环x
y--;
x--;
return fun();
}
else {
//y减少循环
for (; y >= 0 && array[y][x] == 0; y--) {
array[y][x] = currentValue;
currentValue++;
}
yIsAdd = true;//循环结束后将y循环减少置为循环增加
circleX = true;//下次循环x
y++;
x++;
return fun();
}
}
}
}
感觉比较麻烦,谁有简单的方法,可以分享给我,谢谢。