问题描述
问题:有N个人围成一圈,顺序排号。从第一个人开始报数(从1~~3报数),凡报到3的退出圈子,问最后留下的人原来是排在第几号?
解体思路
- 用一个循环队列存放n个人组成对圈(数组或链表实现都可以)
- 用currentCallNum表示当前报数,用index表示当前人对应都索引值
- 当currentCallNum%3 == 0时,表示当前人需要出圈
- 把当前人(array[index%n])的值置为-1
- 当队列长度为1时,遍历整个队列,返回置不为-1当位置
代码实现
package com.learn.algorithm;
public class JosephCircle {
public static int pickup(int n, int m) {
//初始化循环队列
int[] array = new int[n];
for(int i = 0;i < n;i ++) {
array[i] = i + 1;
}
//当前队列长度
int len = n;
//当前报数
int currentCallNum = 1;
//当前索引
int index = 0;
//队列的长度=1时,停止遍历
while(len > 1) {
//判断当前位置是否有人
if(array[index % n] != -1) {
//判断当前报数是否为3
if(currentCallNum % 3 == 0) {
//移除当前人,长度-1
array[index] = -1;
len --;
}
//如果当前位置有人,则报数+1
currentCallNum ++;
}
//遍历到下一个人
index ++;
}
//找到没有被移除的人的位置
int lastPosition = 0;
for(int i = 0;i < n;i ++) {
if(array[i] != -1) {
lastPosition = i;
}
}
return lastPosition;
}
}