Talk is cheap show code direcltly
package alogorm;
import java.util.LinkedList;
/**
* ClassName: YusrfRing
* Description:
* date: 2020-11-20 15:47
*
* @author chenbo
* @since JDK 1.8
*/
public class YusrfRing {
public static void main(String[] args) {
//测试10个人,从第二个人后面的人开始,报到5的出列
ring(10,5);
}
public static void ring(int n, int m){
//首先定义一个队列存储报号的总人数
LinkedList<Integer> quenue = new LinkedList<>();
for (int i = 1; i <= n; i++) {
quenue.add(i);
}
//假设从编号为2的人开始报数,数到5的人出列。
//第一步将第1个和第2个人先出对然后再加到队列末尾,这样从下一位3开始报数
int k = 2;
//要弹出的元素
int element = 0;
//报数记位器
int i = 0;
for (; i <k ; i++) {
//现将1 和 2 位置的人存到队尾。取出这两人位置
element = quenue.poll();
//将1和2 从新加到队尾
quenue.add(element);
}
//从第二号位后开始报数 ,此时的第一个位置上即是3这号人
//初始化计数位
i = 1;
while (quenue.size() > 0){
//当报到第5个数的时候7出列,后面的人继续从1开始,计数位重置为1继续循环
element = quenue.poll();
if (i < m){
quenue.add(element);
i++;
}else {
i = 1;
System.out.println(element);
}
}
}
}