13.圆圈中剩下最后的数

博客围绕小朋友报数出圈问题展开,问题为小朋友围成圈,指定数m,编号0的小朋友开始报数,喊到m - 1的小朋友出列,直至剩下最后一个。解析给出解题步骤,先将元素装入list,处理m - 1大于n的情况,删除对应元素,不断取余直至剩最后一个元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列,不再回到圈中,从他的下一个小朋友开始,继续0…m-1报数…这样下去…直到剩下最后一个小朋友,求最后一个小朋友。

解析:
①首先将所有元素装入list集合中;
②如果m-1大于n,则需要计算m-1 % n的余数;
③删除list中以余数为下标的元素,此时list的长度已经更新;
④继续数m-1,依然取余,直到list中剩下最后一个元素。

public int LastRemaining_Solution(int n, int m){
      if (n==0) return -1;
         ArrayList<Integer> list = new ArrayList<Integer>();
         //将0-n存入list中
         for (int i = 0; i < n; i++){
          list.add(i);
         }
         //这里是防止m的长度大于n,当m大于n时,取余
         int index = (m-1)%n;
         while(list.size() != 0){
          //删除下标为index的元素,即数到m-1的小朋友出圈
          list.remove(index);
          //从index开始继续数m-1
          index = (index+m-1)%list.size();
         }
         //只剩下最后一个元素即为最后一个小朋友
         return list.get(0);
     }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值