猴子选大王,选班长等类似问题

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

分析:
n个人围成一圈,首先想到的就是,用循环加数组,把n个人从一到n编号,顺序放在数组里面,然后定义一个变量用来记录出圈的人数,一次用来当做结束循环的条件,既:当退出圈的人数+1,等于总人数,也就是只剩下一人时,结束循环。
编号从1开始,退出的人用0覆盖其编号,在循环里判断,当数组内容为0时,不在报数。
设一个变量k用来计数,从1到3,之后从新开始从1到3,当数组内容为0时,表示此人已退出,跳过报数。
PS:这样做的原因是因为数组的长度是固定的,不能移除,所以只能用0覆盖。

废话不多说,上代码

public static void main(String[] args){
        int[] a=heihei(5);
         System.out.print("最后剩下的人的编号为:");
        for(int i=0;i<a.length;i++){
                if(a[i]!=0){
                       System.out.println(a[i]);
                 }
        }
  }

public static int[] heihei(int n){
           //初始化数组,用来存放n个数
           int[] a=new int[n]; 
         //for循环向数组里面填数
           for(int i=0;i<n;i++){
                 a[i]=i+1;
           }
          int i=0;//数组里面内容的坐标,a[i]
          int k=0;//用来计算是否到了3次
           int qunit_Num=0;//出圈的人数
          //直到出圈的人数+1=n-1,也就是数组里面只剩下一个非0的数时,结束循环
         while(qunit_Num<n-1){
                 //a[i]!=0.表示这个数还没有出圈,k要进行+1,也就是说ta需要报数。
                 if(a[i]!=0)
                          k++;
                  //当k==3时,把a[i]=0,代表ta出圈啦,不在参与报数。
                if(k==3){
                       a[i]=0;
                       qunit_Num++;//出圈的人数+1
                        k=0;//k复位。从新查数1,2,3,,,,,,
                 }
                  i++;//i+1,向后走一位,进入下次循环,让下一位报数
                  //如果i==n,表示已经轮换一圈,则i复位,从新开始
                  if(i==n)
                   i=0;
         }
      return a;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值