报数问题( 有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。)

报数问题

一、题目内容

题目描述:

​ 有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。

输入格式:

​ 初始人数n

输出格式:

​ 最后一人的初始编号

样例输入:

​ 2

样例输出:

​ 3

二、思路分析

​ 围成一个圈在电脑中没有这个概念,但是在可以用数组来模拟转圈,每一次转到最后,回到最开头接着之前的数据进行判断即可。

​ 因此,在输入有多少人的时候,我们记录总人数number,等在逻辑中number数值等于1的时候,就只剩下最后一个人了,完成游戏的目的。在判断的时候,我们人为规定,数组里面的值为1,则是被淘汰。等于0,则是还存在。使用index来记录报数到了第几次,使用求余(%3)的方法来限制报数在1-3之间,取余等于3的时候,退出。每次完成判断,index都要向后增加,表示下一个人报数的变化。最后可以用for找到数组中数值等于1的下标输出即可,或者像注释res一样,每次都记录数值等于1的下标,完成判断后输出即可。

注意:

  • ​ int[]数组默认值填充0
三、代码实现
public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int number = n;  // 记录还剩下多少人
        int[] arr = new int[n+3];
        int index = 1;  // 记录当前报数的位置
//        int res = 0;  // 方法二,每次记录位置
        while (number != 1) { // 停止条件
            for (int i = 1; i <= n; i++) {
                if (arr[i] != 1) {  // 如果该人还在圆桌上,方便筛掉已经退出的人
                    if (index % 3 == 0) { // 退出的条件
                        arr[i] = 1;
                        number--;
                    }
                    index++; // 报数往后继续
                }
//                if(arr[i] == 0){
//                    res = i;
//                }
            }
        }
//        System.out.println(res);
        
        // 方法一:遍历寻找等于0的下标即可
        for (int i = 1; i <= n; i++) {
            if (arr[i] == 0) {
                System.out.println(i);
                break;
            }
        }
    }

不足之处,请留言指教

你可能感兴趣的:(算法,算法,蓝桥杯,java,数据结构,开发语言)