蓝桥杯 试题 算法训练 筛选号码Java
算法训练 筛选号码
资源限制
时间限制:1.0s 内存限制:512.0MB
问题描述
有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.
所以,最后留下来的人编号是7。
输入格式
一个正整数n,(1<n<10000)
输出格式
一个正整数,最后留下来的那个人的编号。
样例输入
8
样例输出
7
数据规模和约定
对于100%的数据,1<n<10000。
解题思路
1.用数组保存人数的编号
2.用一个变量来作下标记录走到那个人
3.当变量超出数组后应该如何进行下一次循环
4.代码实现
下面展示一些 内联代码片
。
import java.util.*;
public class 筛选号码 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();//输入一个整数n表示有多少个人
ArrayList list=new ArrayList();//创建一个动态数组保存人的编码号
for (int i = 1; i <= n; i++) {//利用for循环为这些人添加编号
list.add(i);
}
int num=-1;//报数的人是从数组下标为0的人开始的,所以我们初始值设为-1
while (list.size()>1)//退出条件就是当数组个数只有一个的时候
{
for (int i = 0; i < 3; i++) //每次报数需要循环三次 也就是三个人
{
num++;//最初进来的人下标+1也就是0;
if (num==list.size()) //判断条件当下标数值等于数组长度时,就说明已经一轮轮完了这时候num数值恢复到第一个下标位置
{
num=0;
}
}
list.remove(num);//移除下标数组为num数值的人
num--;//由于删除掉一个人 ,我们要进行找下一个人,所以num数值要-1然后开始下一轮的寻找
}
System.out.println(list.get(0));
}
}