题目:
Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order.
For example,
Given n = 3
,
[ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]题意:
给一个n * n的数组,然后就是采用顺时针的方向将这个数组填满,那么我们考虑,注意此题和之前的那题有点类似,但是也不是非常相像,因为这题比较简单,不会出现n * m的那种矩阵,一定是n * n的形式,所以我们在将所有数字输入到数组中的时候,可以继续考虑用上一题的思路来做。
public int[][] generateMatrix(int n)
{
int[][] result = new int[n][n];
int startV = 1;
int startX = 0;
int startY = 0;
int endX = n - 1;
int endY = n - 1;
while(startX <= endX)
{
startV = fillMatrix(startX,endX,startY,endY,result,startV);//这里的startV每次都得保存的,并且作为返回值返回作为下一次的一个参数输入的
startX++;
startY++;
endX--;
endY--;
} //所以这里是个技巧
return result;
}
public int fillMatrix(int rowstart,int rowend,int colstart,int colend,int[][] result,int startV)
{
if(rowstart == rowend) //如果只有一个元素,那么直接将这个元素保存进数组中
{
result[rowstart][colstart] = startV;
return -1;
}
//上边,遍历每一边,但是得注意的是,这里的startV是作为返回值返回的
for(int i = colstart; i <= colend; i++)
{
result[rowstart][i] = startV;
startV++;
}
//右边
for(int i = rowstart + 1; i <= rowend; i++)
{
result[i][colend] = startV;
startV++;
}
//下边,注意有些位置不用再加了
for(int i = colend - 1; i >= colstart; i--)
{
result[rowend][i] = startV;
startV++;
}
//左边
for(int i = rowend - 1; i >= rowstart + 1; i--)
{
result[i][colstart] = startV;
startV++;
}
return startV;
}
此题这里需要注意,和之前的那题相得益彰。