[蓝桥杯][算法训练VIP]筛选号码-题解(Java代码)

题目描述
有n个人围成一圈,顺序排号(编号为1到n)。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子。从下一个人开始继续报数,直到剩下最后一个人,游戏结束。

问最后留下的是原来第几号的那位。

举个例子,8个人围成一圈:

1 2 3 4 5 6 7 8

第1次报数之后,3退出,剩下:

1 2 4 5 6 7 8 (现在从4开始报数)

第2次报数之后,6退出,剩下:

1 2 4 5 7 8 (现在从7开始报数)

第3次报数之后,1退出,剩下:

2 4 5 7 8 (现在从2开始报数)

第4次报数之后,5退出,剩下:

2 4 7 8 (现在从7开始报数)

第5次报数之后,2退出,剩下:

4 7 8 (现在从4开始报数)

第6次报数之后,8退出,剩下:

4 7 (现在从4开始报数)

最后一次报数之后,4退出,剩下:

所以,最后留下来的人编号是7。

数据规模和约定

对于100%的数据,1< n< 10000。

输入
一个正整数n,(1< n< 10000)

输出
一个正整数,最后留下来的那个人的编号。

通过List来删除数据

import java.util.Scanner;
import java.util.LinkedList;
import java.util.List;
public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        List<Integer> list=new LinkedList<>();//创建List
        for (int i = 1; i <=n ; i++) {
            list.add(i);//输入数据
        }
        int x=1;//计数
        int m=0;//当前list的下标
        while(list.size()!=1) {//如果list的长度大于1
            if(x==3) {//如果计数器到达3就移除当前数据
                list.remove(m);
                x=1;//重置计数器
            }
            x++;//
            m=(m+1)%list.size();//以防m的值超出list的长度
        }
        System.out.println(list.get(0));//获取list的0号数据
    }
}

你可能感兴趣的:(算法)