黑马程序员技术交流社区

标题: 学到二维数组,自己琢磨出的一道练习题 [打印本页]

作者: 王瀛    时间: 2013-6-28 22:58
标题: 学到二维数组,自己琢磨出的一道练习题
本帖最后由 孙百鑫 于 2013-7-1 07:44 编辑

rt,打印螺旋数组的练习题。自己刚写出来,代码如下,欢迎指正~
(有简单方法的请跟帖贴代码,说思路)
  1. /*
  2. 题目:打印螺旋数组。
  3. Case:
  4. 1        2        3        4
  5. 12        13        14        5
  6. 11        16        15        6
  7. 10        9        8        7

  8. 思路:
  9. 1.判断循环次数,即:有几圈;
  10. 2.每次循环中都遵循相同的打印规律,即:上横(左到右)-->右竖(上到下)-->下横(右到左)-->左竖(下到上);
  11. 3.定义需要写入的值value,初始化为0,每赋值一次,自增1;
  12. 4.遍历二维数组,换行打印;

  13. Ps:
  14. 1.为了使代码更具普遍性,定义一个变量size,用于表示数阵的边长。
  15. 2.为了增强代码的功能,将长宽相等的情况提取为任意row、column的情况。

  16. 想到可以将原size用row(行)和column(列)表示,扩充代码功能。
  17. */

  18. class  SpiralArray
  19. {
  20.         public static void main(String[] args)
  21.         {
  22.                 int row = 7;//定义非规则数阵的长和宽
  23.                 int column = 5;
  24.                 int size = 9;//定义规则数阵(长宽相等)的边长
  25.                 int[][] arr1 = ArrayTool.setArray(size);//调用数组工具类中的setArray(int size)方法,将得到的二维数组赋给arr
  26.                 int[][] arr2 = ArrayTool.setArray(row,column);//调用数组工具类中的setArray(int row,int column)方法,将得到的二维数组赋给arr
  27.                 ArrayTool.printArr(arr1);//调用数组工具类中的打印数组方法
  28.                 System.out.println("*****************************");
  29.                 ArrayTool.printArr(arr2);
  30.         }
  31. }

  32. //之前思路过于麻烦,代码就不写了。

  33. class ArrayTool//定义数组工具类
  34. {
  35.         public static int[][] setArray(int size)//函数的重载。传入数阵边长,调用setArray(int row,int column)方法,返回符合规则的二维数组
  36.         {
  37.                 int row = size;//定义行、列,分别赋值为size
  38.                 int column = size;
  39.                 int[][] arr = setArray(row,column);//函数间调用,重载
  40.                 return arr;
  41.         }
  42.         public static int[][] setArray(int row,int column)//传入数阵的row(行)和列(column),返回符合规则的二维数组
  43.         {
  44.                 int loopNum = loopNum(row,column);//得到循环次数上限
  45.                 int[][] arr = new int[row][column];//定义二维数组
  46.                 int num = 1;//定义循环次数,初始化为1(最大值为loopNum)
  47.                 int value = 1;//定义写入的值,从1开始
  48. //                int h = 0;//行指针
  49. //                int l = 0;//列指针
  50.                 for (;num<=loopNum;num++ )//控制循环次数
  51.                 {
  52.                         for (int h=num-1,l=num-1;l<=column-num ;l++ )//每次循环的上横1
  53.                         {
  54.                                 arr[h][l] = value++;
  55.                         }
  56.                         for (int h=num,l=column-num;h<=row-num ;h++ )//每次循环的右竖1
  57.                         {
  58.                                 arr[h][l] = value++;
  59.                         }
  60.                         for (int h=row-num,l=column-num-1;l>=num-1 ;l-- )//每次循环的下横2
  61.                         {
  62.                                 arr[h][l] = value++;
  63.                         }
  64.                         for (int h=row-num-1,l=num-1;h>=num ;h-- )//每次循环的左竖1
  65.                         {
  66.                                 arr[h][l] = value++;
  67.                         }
  68.                 }
  69.                 return arr;
  70.         }
  71.         public static int loopNum(int row,int column)//根据数阵的行列值,判断循环次数(规律:循环次数由row与column中的小值决定)
  72.         {
  73.                 int base = row>=column?column:row;//获取行列中的较小值作为基数
  74.                 return (base%2==0)?(base/2):((base/2)+1);//三元运算符,根据基数(row和column中的较小值)的奇偶,得到所需循环次数
  75.         }
  76.         private static void printArr(int[] arr)//定义打印一维数组方法
  77.         {
  78.                 for (int x=0;x<arr.length ;x++ )
  79.                 {
  80.                         System.out.print(arr[x]+"\t");
  81.                 }
  82.         }
  83.         public static void printArr(int[][] arr)//重载,定义打印二维数组方法
  84.         {
  85.                 for (int x=0;x<arr.length ;x++ )
  86.                 {
  87.                         printArr(arr[x]);//函数间调用
  88.                         System.out.println();
  89.                 }
  90.         }
  91. }
复制代码
9行9列标准数阵  和  7行5列一般数阵的结果分别是:



作者: 王瀛    时间: 2013-6-28 23:00
另:
1.怎么不能编辑自己发的帖子了;
2.谁赏个分,让我直接跳到高级黑马{:soso__3219697122502634617_6:}
作者: 陈雪琪    时间: 2013-6-28 23:34
好有意思的一道题,先瞄一瞄~明天研究一下。。。
作者: 张云杰    时间: 2013-6-29 02:13
收藏了.. 计算机竞赛的题目..
作者: 万琪    时间: 2013-6-29 09:12
嫂年- -,,我还差70,,
作者: Just_Only    时间: 2013-6-29 09:25
支持了。。。
作者: 张云杰    时间: 2013-6-29 13:07
万琪 发表于 2013-6-29 09:12
嫂年- -,,我还差70,,

- -  昨晚看才60多  瞬间76  你这速度也太快了
作者: 张云杰    时间: 2013-6-29 13:07
万琪 发表于 2013-6-29 09:12
嫂年- -,,我还差70,,

靖远回复那么多 都没你的快- -
作者: 万琪    时间: 2013-6-29 13:19
张云杰 发表于 2013-6-29 13:07
靖远回复那么多 都没你的快- -

呵呵,,




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2