A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

public static void main(String[] args) {

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

        }

        /**
         * @param peoples
         *            玩游戏的人数
         * @param number
         *            报的数字
         * @return 最后留下一个人的序号
         */
        public static Integer play(int peoples, int number) {
                // 创建集合,赋值1~number的数字,代表玩游戏的人的序号
                ArrayList<Integer> list = new ArrayList<Integer>();
                for (int i = 1; i <= peoples; i++) {
                        list.add(i);
                }
                // 指针,代表报数的人的位置
                int pointer = 0;
                // 报数的数字
                int count = 1;
                // 游戏结束点:最后留下一个人
                while (list.size() > 1) {
                        // 指针超过集合长度,表示完成1轮报数,第一个人继续报数
                        if (pointer == list.size()) {
                                // 指针回到第一个人
                                pointer = 0;
                        }
                        // 报数14,
                        if (count % number == 0) {
                                // 查看每一个报到指定数字的人
                                // System.out.println("退出的是第" + list.get(pointer) + "人");

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

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

                                // 重新从1开始报数
                                count = 1;
                        } else {
                                
                                // 没有报到14的,指针往后移动
                                pointer++;
                                
                                // 报数加1
                                count++;
                        }
                }
                //返回最后剩下的人的序号
                return list.get(0);
        }
public static void main(String[] args) {
                //调用方法,获取数组并打印
                printMetirx(getMetirx(4));

        }

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

        /**
         * @param n 二维数组的大小
         * @return int[n][n] 返回一个螺旋矩阵
         *
         * @author   思路:按“口”字形赋值,先给最外层一圈赋值,再给第二圈赋值....直至结束。
         *                           用上下左右四个顶点的位置来确定“口”的大小。
         *           每次赋值完成一条边,对应的顶点往中心靠拢。
         */
        public static int[][] getMetirx(int n) {
                // 创建二维数组
                int[][] metirx = new int[n][n];
                // 赋值圈数
                int count = (n + 1) / 2;
                // 起始数
                int start = 1;
                // “口”字形圈的四个顶点
                int left = 0, right = n - 1, top = 0, botton = n - 1;
                // 赋值次数,即圈数
                for (int i = 0; i < count; i++) {
                        // 给上边缘赋值,从左往右
                        for (int x = left; x <= right; x++) {
                                metirx[top][x] = start++;
                        }
                        // 上顶点往下移
                        top++;
                        // 给右边缘赋值,从上往下
                        for (int y = top; y <= botton; y++) {
                                metirx[y][right] = start++;
                        }
                        // 右顶点往左移
                        right--;
                        // 给下边缘赋值,从右往左
                        for (int x = right; x >= left; x--) {
                                metirx[botton][x] = start++;
                        }
                        // 下顶点往上移
                        botton--;
                        // 给左边缘复制,从下往上
                        for (int y = botton; y >= top; y--) {
                                metirx[y][left] = start++;
                        }
                        // 左顶点往右移
                        left++;
                }
                // 返回赋值完成的二维矩阵
                return metirx;

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马