某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队。训练的规则为从头开始进行1到2报数,凡报2的出列,剩下的向小序号方向靠拢,再从头开始进行1到3报数,凡报到3出列,剩下的向小序号靠拢,继续从头开始进行1到2报数,按此规则一直进行下去,直到最后剩下的人数为3为止。
输入:输入新兵人数
输出:输出剩下的新兵的最初编号,编号之间有一个空格。
本问题为报数问题,可以使用 LinkedList 解决。
1 定义一个 LinkedList ,将1~n依次放入链表尾部。
2 如果链表中元素大于3,则计数器 count = 1;遍历链表,如果 count++%k,则删除当前元素,否则指向下一个继续计数;首先 k=2,报数结束后,再 k=3,交替进行。
3 按顺序输出链表中的元素,以空格隔开,最后换行。
package concurrent;
import java.util.*;
/**
* @className: Soldiertraining
* @description: 士兵训练
* @date: 2022/3/5
* @author: 贝医
*/
public class Soldiertraining {
public static void main(String[] args) {
// 模拟士兵队列
List<Integer> list = new LinkedList<>();
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
// 将士兵的编号入队列
for (int i = 1; i <= n; i++) {
list.add(i);
}
// 开始从2开始报数
int k = 2;
Iterator<Integer> it;
// 队列中超过3人,训练就不结束
while (list.size() > 3) {
it = list.iterator();
int count = 1;
// 报数出列逻辑
while (it.hasNext()) {
it.next();
if (count % k == 0) {
it.remove();
}
count++;
}
// 2 3 切换逻辑
k = (k == 2 ? 3 : 2);
}
// 输出
for (Integer integer : list) {
System.out.println(integer);
}
}
}
绿色为输入,白色为输出。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/chengqiuming/article/details/123296417
内容来源于网络,如有侵权,请联系作者删除!