4月3号腾讯实习生笔试考到了蛇形矩阵,尼玛没做出来,要跪了。。。
后面想了想,实现了一个方案
蛇形矩阵:输入一个数n,输出对应的矩阵,比如
n=3,则矩阵为:
1 2 3
8 9 4
7 6 5
方案:定义一个变量direction记录当前的方向(以东西南北),可以看到蛇形矩阵构造的方向为:东->南->西->北->东,如此循环
代码如下:
public static int[][] snakeMatrix(int n){
int[][] storage=new int[n][n];
int direction=0;//代表转的方向 0-东,1-南,2-西,3-北
int number=1;
/*这里curY设置为-1方便第一行与其他行统一处理*/
int curX=0,curY=-1;
while(number<=n*n){
switch(direction){
case 0: //东方向,x不变,y递增
curY++; //每一行第一个数在前一个方向时已经设置了,因此本方向跳过,矩阵起始第一行我们把curY设为了-1,因此跳过一个后恰好是第一个元素
while(curY<n && storage[curX][curY]==0){ //利用矩阵数组初始值全为0判断本方向是否已经到了还没有设置值的边界
storage[curX][curY]=number;
curY++;
number++;
}
curY--;
direction=1;//改变方向
break;
case 1:
curX++;
while(curX<n&&storage[curX][curY]==0){
storage[curX][curY]=number;
curX++;
number++;
}
curX--;
direction=2;
break;
case 2:
curX--;
while(curY>=0&&storage[curX][curY]==0){
storage[curX][curY]=number;
curX--;
number++;
}
curX++;
direction=3;
break;
case 3:
curY--;
while(curY>=0&&storage[curX][curY]==0){
storage[curX][curY]=number;
curY--;
number++;
}
curY++;
direction=0;
break;
}
}
return storage;
}
代码遍历了矩阵一次,时间复杂度为 O(n^2)