蓝桥杯 试题 算法训练 筛选号码 Java

蓝桥杯 试题 算法训练 筛选号码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));
	}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值