华为OD机试真题-报数游戏
题目描述
100
个人围成一圈,每个人有一个编码,编号从1开始到100。
他们从1开始依次报数,报到为M的人自动退出圈圈,然后下一个人接着从1开始报数,直到剩余的人数小于M
。
请问最后剩余的人在原先的编号为多少?
输入描述
输入一个整数参数 M
输出描述
如果输入参数M小于等于1或者大于等于100,输出“ERROR!”;
否则按照原先的编号从小到大的顺序,以英文逗号分割输出编号 字符串Q
示例1
输入
3
输出
58.91
说明
输入M为3,最后剩下两个人。
示例2
输入
4
输出
34.45.97
说明
输入M为4,最后剩下三个人。
题解
约瑟夫环问题
源码 java
public class Main {
static Input input;
static {
input = new Input("3");
}
public static void main(String[] args) {
int M = Integer.parseInt(input.nextLine());
if (M <= 1 || M >= 100) {
System.out.println("ERROR");
return;
}
// 初始化一个圆圈队列
List<String> list = new ArrayList<>();
for (int i = 1; i <= 100; i++) {
list.add(i+"");
}
int index = M-1;
// 剩余人数只要大于等于 M 就说明有需要淘汰的人
while (list.size() >= M) {
System.out.print(list.remove(index)+",");
index = index + M -1;
if (index >= list.size()) {
index %= list.size();
}
}
System.out.println();
System.out.println(String.join(",", list));
}
}
#我的岗位说明书##运营每日一题#