前些天去面试,有个题目:
根据输入值,比如输入5,打印如下数字:
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
一开始的初步实现
public class ArrayPrint {
int[][] aa ;
int start=1;
/*递归调用*/
public void makeArray(int num,int index){
//index 从0开始,把数组圈分成4部分
int length = num-index*2;
for(int i=0;i<length;i++){//上横列
if(start<=num*num){
aa[index][i+index]=start++;
}
}
for(int i=1;i<length;i++){//右竖列
if(start<=num*num){
aa[i+index][length+index-1]=start++;
}
}
for(int i=length-2;i>=0;i--){//下横列
if(start<=num*num){
aa[length+index-1][index+i]=start++;
}
}
for(int i=length-2;i>0;i--){//左竖列
if(start<=num*num){
aa[index+i][index]=start++;
}
}
}
public void display(){
for(int i=0;i<aa.length;i++){
int[] str = aa[i];
for(int j=0;j<str.length;j++){
System.out.print(str[j]+",");
}
System.out.println("");
}
}
public void printArray(int num){
aa = new int[num][num];
for(int i=0;i<num;i++){
makeArray(num,i);
}
}
public static void main(String args[]){
ArrayPrint ap = new ArrayPrint();
ap.printArray(10);
ap.display();
}
}
逻辑比较粗劣,用的是递归
同时在想 如果不是N*N的数列,那应该怎么做。
然后就在在网上看别人的实现方法
public class SpiralArray {
public SpiralArray(int m,int n) {
int dir = 1;
int[][] sArray =new int[m][n];
int up = n;//每个方向上的计算次数
int right = m - 1;
int down = n - 1;
int left = m - 2;
int flag = 0;//计算次数统计标志
int i = 0;//数组第一个下标
int j = -1;//数组第二个下标,因为先要+1,所以从-1开始
for(int k=1;k<=m*n;k++) {
switch(dir) {
case 1:
j++;//向右移动
flag++;//移动次数
if(flag == up) {
up -= 2;//计算次数满,使其成为下次将要计算的次数
flag = 0;//标志清零
dir = 2;//变换方向
}
break;
case 2:
i++;//下移
flag++;
if(flag == right) {
right -= 2;
flag = 0;
dir = 3;
}
break;
case 3:
j--;//左移
flag++;
if(flag == down) {
down -= 2;
flag = 0;
dir = 4;
}
break;
case 4:
i--;//上移
flag++;
if(flag == left) {
left -= 2;
flag = 0;
dir = 1;
}
break;
default:
break;
}
sArray[i][j] = k;//利用K的循环次数,给数组赋值
}
//打印数组
for(int a=0;a<m;a++) {
for(int b=0;b<n;b++) {
System.out.print(sArray[a][b]+"\t");
}
System.out.println();
}
}
public static void main(String[] args) {
SpiralArray sa = new SpiralArray(5,4);
}
}
发现自己的思维还是欠缺更合理的算法啊。
基础不扎实,需要加油啊