约瑟夫环的2种解决

 

问题:一共n个人,查到m的人出圈,求最后圈里的人是几号。

 

public class YusefuTest {

 

 /**
  * 返回最后一个出列的人数
  *
  * @param n
  * @param m
  * @return
  */
 private static int YSF1(int n, int m) {
  int r = 0;
  for (int i = 2; i <= n; i++) {
   r = (r + m) % i;
  }
  return r + 1;
 }

 

 

 /**
  * 返回出列顺序数组
  *
  * @param n
  * @param m
  * @return
  */
 private static int[] YSF2(int n, int m) {
  boolean[] c = new boolean[n];
  int k = 0;
  int result[] = new int[c.length];
  for (int i = 0; i < c.length; i++) {
   c[i] = true;
  }

  int leftCount = c.length;
  int index = 0;
  int counter = 1;
  
  while (leftCount > 0) {
   if (c[index] == true) {
    if (counter == m) {
     c[index] = false;
     leftCount--;
     counter = 0;
     result[k] = index + 1;
     k++;
    }
    counter++;
   }

   index++;
   if (index == c.length)
    index = 0;
  }
  return result;
 }

 

 /**
  * @param args
  */
 public static void main(String[] args) {
  int n = 120;
  int m = 3;
  System.out.println(YSF1(n, m));

  int[] result = YSF2(n, m);
  for (int i = 0; i < result.length; i++) {
   System.out.print(result[i] + " ");
  }
 }

}

 

 

注解:
public class TestCircle {

 public static void main(String[] args) {

  int num = 10;
  int m = 3;
  boolean[] arr =new boolean[num];
  for (int i = 0; i < arr.length; i++) {
   arr[i] = true; // 为数组赋上boolean型的初值
  }
  int leftCount = arr.length;
  int countNum = 1; // 这是一个报数器
  int index = 0; // 作用类似一个指针,这里指队列人员的编号0-9

  while (leftCount > 1) // 如果最后剩下的人数不为1,则循环至只剩一人为止
  {
   if (arr[index] == true)// 如果arr[index]为true则表示此人尚在队列中或暂时未被3整除
   {

    if (countNum == m)// 某人报的数为3
    {
     countNum = 0;// 有人出列后,下个人重新开始从1报数,如此反复,此步是将报数器初始化
     arr[index] = false;// arr[index]为false表示此人已经出列了
     leftCount--;// 剩下的人员总数则减少一个

    }

    countNum++; // 从1开始重新报数,或下一个人继续报下一个数
   }
   
   index++;// 下一个人准备开始报数

   if (index == arr.length)// 每次最后一人报完数后就从编号为0的人开始重新报数
   {
    index = 0;
   }
   
  }
  // 退出while时队列中仅剩一人了

  for (int i = 0; i < arr.length; i++) {
   if (arr[i] == true)// 剩下的那一个人就是值为true的那个人
   {
    System.out.println(i);
   }
  }
 }

}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值