黑马程序员技术交流社区

标题: 【黑马程序员】写一方法,打印等长的二维数组,要求从1... [打印本页]

作者: huburt    时间: 2016-5-20 22:20
标题: 【黑马程序员】写一方法,打印等长的二维数组,要求从1...
  1. public static void main(String[] args) {

  2.                 System.out.println("最后留下的是第" + play(100, 14) + "人。");

  3.         }

  4.         /**
  5.          * @param peoples
  6.          *            玩游戏的人数
  7.          * @param number
  8.          *            报的数字
  9.          * @return 最后留下一个人的序号
  10.          */
  11.         public static Integer play(int peoples, int number) {
  12.                 // 创建集合,赋值1~number的数字,代表玩游戏的人的序号
  13.                 ArrayList<Integer> list = new ArrayList<Integer>();
  14.                 for (int i = 1; i <= peoples; i++) {
  15.                         list.add(i);
  16.                 }
  17.                 // 指针,代表报数的人的位置
  18.                 int pointer = 0;
  19.                 // 报数的数字
  20.                 int count = 1;
  21.                 // 游戏结束点:最后留下一个人
  22.                 while (list.size() > 1) {
  23.                         // 指针超过集合长度,表示完成1轮报数,第一个人继续报数
  24.                         if (pointer == list.size()) {
  25.                                 // 指针回到第一个人
  26.                                 pointer = 0;
  27.                         }
  28.                         // 报数14,
  29.                         if (count % number == 0) {
  30.                                 // 查看每一个报到指定数字的人
  31.                                 // System.out.println("退出的是第" + list.get(pointer) + "人");

  32.                                 // 报到指定数字的人退出游戏
  33.                                 list.remove(pointer);

  34.                                 // 有人退出,集合长度就会减少,原本退出位置的后一位向前移,因此还是从退出位置开始报数
  35.                                 // pointer++;//不需要!

  36.                                 // 重新从1开始报数
  37.                                 count = 1;
  38.                         } else {
  39.                                
  40.                                 // 没有报到14的,指针往后移动
  41.                                 pointer++;
  42.                                
  43.                                 // 报数加1
  44.                                 count++;
  45.                         }
  46.                 }
  47.                 //返回最后剩下的人的序号
  48.                 return list.get(0);
  49.         }
  50. public static void main(String[] args) {
  51.                 //调用方法,获取数组并打印
  52.                 printMetirx(getMetirx(4));

  53.         }

  54.         // 打印数组的方法
  55.         public static void printMetirx(int[][] metirx) {
  56.                 // 二维数组实际上外层是一个数组的数组,元素是int[]数组
  57.                 // 循环访问外层数组的元素
  58.                 for (int i = 0; i < metirx.length; i++) {
  59.                         // 访问到的外层数组的元素:int[]数组
  60.                         // 在循环访问内层数组
  61.                         for (int j = 0; j < metirx[i].length; j++) {
  62.                                 // 打印对应元素
  63.                                 System.out.print(metirx[i][j]);
  64.                                 // 添加空格
  65.                                 System.out.print("\t\t");
  66.                         }
  67.                         // 外层数组的元素单独显示一行,即一个int[]数组显示在一行
  68.                         System.out.print('\n');
  69.                 }
  70.         }

  71.         /**
  72.          * @param n 二维数组的大小
  73.          * @return int[n][n] 返回一个螺旋矩阵
  74.          *
  75.          * @author   思路:按“口”字形赋值,先给最外层一圈赋值,再给第二圈赋值....直至结束。
  76.          *                           用上下左右四个顶点的位置来确定“口”的大小。
  77.          *           每次赋值完成一条边,对应的顶点往中心靠拢。
  78.          */
  79.         public static int[][] getMetirx(int n) {
  80.                 // 创建二维数组
  81.                 int[][] metirx = new int[n][n];
  82.                 // 赋值圈数
  83.                 int count = (n + 1) / 2;
  84.                 // 起始数
  85.                 int start = 1;
  86.                 // “口”字形圈的四个顶点
  87.                 int left = 0, right = n - 1, top = 0, botton = n - 1;
  88.                 // 赋值次数,即圈数
  89.                 for (int i = 0; i < count; i++) {
  90.                         // 给上边缘赋值,从左往右
  91.                         for (int x = left; x <= right; x++) {
  92.                                 metirx[top][x] = start++;
  93.                         }
  94.                         // 上顶点往下移
  95.                         top++;
  96.                         // 给右边缘赋值,从上往下
  97.                         for (int y = top; y <= botton; y++) {
  98.                                 metirx[y][right] = start++;
  99.                         }
  100.                         // 右顶点往左移
  101.                         right--;
  102.                         // 给下边缘赋值,从右往左
  103.                         for (int x = right; x >= left; x--) {
  104.                                 metirx[botton][x] = start++;
  105.                         }
  106.                         // 下顶点往上移
  107.                         botton--;
  108.                         // 给左边缘复制,从下往上
  109.                         for (int y = botton; y >= top; y--) {
  110.                                 metirx[y][left] = start++;
  111.                         }
  112.                         // 左顶点往右移
  113.                         left++;
  114.                 }
  115.                 // 返回赋值完成的二维矩阵
  116.                 return metirx;
  117.         }
复制代码





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