目录
1. 回形(螺旋)数组题目解析
为满足回形(螺旋)数组的要求,在此给出一个创建回形(螺旋)数组的思路。
(以输入数字4为例)
1)定义行变量top、right,索引值分别为0、3;列变量left、right,索引值分别为0、3。
2)按顺时针方向开始填充回形数组(定义num为填充数,初始值为 1)
1. 从左到右(设 top = 0,列数为 i ,i 初始值为 left ):
// 从左到右赋值
for (int i = left; i <= right; i++)
{
SpiralArr[top][i] = num++;
}
top++;
* 为保证下一次填充(上到下)的初始值 5 ,不与此次填充(左到右)的末尾值 4 冲突,因此每完成一次填充 for 循环后,对 i 的初始值自加 1 。
2. 从上到下(设 right = 3,行数为 i ,i 初始值为 top ):
// 从上到下赋值
for (int i = top; i <= bottom; i++)
{
SpiralArr[i][right] = num++;
}
right--;
3. 判断是否满足循环结束条件
// 判断是否满足结束循环的条件
if (left > right || top > bottom)
{
break;
}
4. 从右到左(设 bottom = 3,列数为 i ,i 初始值为 right ):
// 从右到左赋值
for (int i = right; i >= left; i--)
{
SpiralArr[bottom][i] = num++;
}
bottom--;
5. 从下到上(设 left = 0,行数为 i ,i 初始值为 bottom ):
// 从下到上赋值
for (int i = bottom; i >= top; i--)
{
SpiralArr[i][left] = num++;
}
left++;
2. 完整代码展示
import java.util.Scanner;
class SpiralArr
{
public static void main(String[] args) {
// 通过键盘输入获取一个整数
Scanner scan = new Scanner(System.in);
System.out.print("请输入一个整数: ");
int input = scan.nextInt();
// 定义一个int 类型的回形数组 SpiralArr(二维数组)
// 将输入的整数分别赋值给回形数组的行数和列数
int[][] SpiralArr = new int[input][input];
// 填充回形数组
// 定义一个局部变量num 其值为要填充到回形数组中的数值(初始值为1)
// 并定义变量top,bottom,left,right,根据它们的含义将回形数组的索引分别赋值给各个变量
int num = 1;
int top = 0, bottom = input - 1, left = 0, right = input - 1;
while(left <= right && top <= bottom) // 定义循环条件
{
// 从左到右赋值
for (int i = left; i <= right; i++)
{
SpiralArr[top][i] = num++;
}
top++;
// 从上到下赋值
for (int i = top; i <= bottom; i++)
{
SpiralArr[i][right] = num++;
}
right--;
// 判断是否满足结束循环的条件
if (left > right || top > bottom)
{
break;
}
// 从右到左赋值
for (int i = right; i >= left; i--)
{
SpiralArr[bottom][i] = num++;
}
bottom--;
// 从下到上赋值
for (int i = bottom; i >= top; i--)
{
SpiralArr[i][left] = num++;
}
left++;
}
// 打印回形数组
for (int i = 0; i < input; i++)
{
for (int j = 0; j < input; j++)
{
System.out.print(SpiralArr[i][j] + "\t");
}
System.out.println();
}
// 关闭Scanner 防止资源泄露
scan.close();
}
}
3. 循环条件的解释
在完整代码中,填充回形数组时,一次螺旋循环中共有两次循环条件判定。
两次循环条件判定都在一次纵向填充(上到下、下到上)过后,因为根据回形数组特性,每个回形数组都以一次横向循环(左到右,右到左)结束,但代入不同输入整数遍历代码可知,实际上在进行完最后一次横向循环后会出现 left = right 的情况,又由于该情况满足下次横向循环的条件,因此为避免下一次横向循环的发生在每次纵向填充后都进行一次循环条件判定,即使此次纵向循环不满足循环条件而未发生,也会执行循环后的 top++ 、bottom-- 语句,从而使得因 top > bottom 不满足循环条件而结束循环,完成回形数组的创建。