前些天去面试,有个题目:
根据输入值,比如输入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);
}
}
发现自己的思维还是欠缺更合理的算法啊。
基础不扎实,需要加油啊
分享到:
相关推荐
本节将详细介绍如何在Java中实现螺旋数组的功能,包括初始化数组、填充螺旋数组以及打印螺旋数组的过程。 ##### 1. 类与方法定义 首先定义一个名为`RotateArray`的类,并在其中定义`main`方法作为程序入口。此外,...
大家都来下下..改进改进 我没积分了...我要下东西.... 大家都支持支持...
在实际编程中,可能会遇到更复杂的情况,例如,输入的不是固定大小的矩阵,而是动态大小的二维数组,或者需要填充而不是仅打印螺旋数组。这时,你需要使用动态内存分配(如`new`运算符)来创建二维数组,并调整填充...
螺旋数组,又称螺旋矩阵,是一种特殊的二维数组布局方式,它按照顺时针或逆时针方向从外向内填充数字。在C语言中实现螺旋数组,我们需要理解数组的基本操作、循环控制以及条件判断。下面我们将深入探讨这个话题。 ...
i++) { // 打印螺旋数组 for (j = 0; j ; j++) printf("%3d", a[i][j]); printf("\n"); } } ``` ##### 6. 运行结果分析 运行上述代码后,会得到如下输出结果: ``` 2 3 3 5 6 5 5 5 4 5 3 5 2 5 1 2 4 3 3 4...
这将展示如何用C++实现螺旋数组的打印功能。 此外,还可以扩展这个程序,添加读取用户输入的功能,或者修改为动态生成大小的螺旋数组。还可以增加其他功能,比如生成螺旋数组、反转螺旋数组、查找特定元素等,这些...
此外,代码还提供了一个扩展的`printValue`函数,用于打印螺旋数组中的某个元素。这个函数接收当前头、行、列和数组大小作为参数,根据螺旋规则计算出对应位置的值。`SpiralNumber`函数遍历数组的所有元素,调用`...
本主题将深入探讨如何以螺旋方式打印二维数组,以及如何自动生成二维数组进行测试。 螺旋打印二维数组是一种独特的方法,它按照顺时针或逆时针的方向依次输出数组元素。对于一个N*N的二维数组,螺旋打印的过程可以...
该算法可以螺旋打印二维数组a[M][N],即,先打印第一行,然后打印最右边的一列,然后打印最下面的那一行,从右往左打印,接着打印最左边的那一列,从下往上打印。这样最外面的一圈打印完了,接着打印里面的一圈,按照...
- **输入输出**:可能需要从用户获取矩阵的大小,并打印出生成的螺旋矩阵。 在提供的链接中,博主可能分享了一个具体的C语言实现螺旋矩阵的示例代码,你可以通过阅读和理解该代码来进一步学习这个概念。同时,这个...
这是一个JAVA中关于二维数组的拔高题。
这个函数接受一个二维数组和它的行数`m`和列数`n`作为参数,然后按照螺旋顺序打印数组的元素。注意,为了处理数组边缘情况,我们需要在每次遍历完一个边界后检查是否还有剩余的部分可以遍历。 这个经典算法面试题...
// 打印螺旋方阵 } ``` **程序解析**: - 定义了一个大小为5x5的二维数组`arr`。 - 通过嵌套循环依次填充每个边界,并更新数组中的值。 - 最后打印生成的螺旋方阵。 #### 版本三 ```c #define N 5 #define down ...
螺旋上三角是一种特殊的矩阵打印方式...总之,实现螺旋上三角打印涉及了C语言的基础知识,包括数组操作、循环控制和条件判断。通过理解这个过程,不仅可以掌握这一特定问题的解决方法,还能加深对C语言编程原理的理解。
螺旋式遍历二维数组,也称为矩阵的螺旋顺序遍历,是一种常见的算法问题,它涉及到对二维数组元素的特殊访问顺序。在这个问题中,我们从数组的最外层开始,按照顺时针方向(上→右→下→左)依次访问元素,直到访问完...
8. **输出结果**:最后,可以通过遍历整个二维数组并打印其内容,以展示生成的螺旋数组。 在提供的压缩包文件中,"text1_xunhuan.c"很可能是实现螺旋数组生成的源代码文件,而".dsp", ".dsw", ".ncb", ".opt", 和 ...
螺旋矩阵是一种特殊的二维数组,它的元素按照特定的螺旋顺序排列。在给定的场景中,我们需要实现一个程序,能够根据用户输入的数字n生成一个n×n的螺旋矩阵,并打印出来。例如,当输入为3时,输出的矩阵是: ``` 1 ...
打印螺旋矩阵是编程中的一个经典问题,它涉及到数组操作和循环控制。在本问题中,我们需要创建一个M*N的螺旋矩阵,并进行打印。同时,题目还提到了计算N*N矩阵的行列式的值,这是一个线性代数中的概念。 首先,让...
首先,我们需要理解螺旋数组的规律。螺旋数组从左上角开始,沿着顺时针方向依次填充数字。当一行或一列填满后,数组的遍历会转向下一圈。例如,对于5x5的数组,其初始状态如下: ``` 1 2 3 4 5 16 17 18 19 6 15 24...