100个人围成一圈,每个人有一个编码,编号从1开始到100。他们从1开始依次报数,报到为M的人自动退出圈圈,然后下一个人接着从1开始报数,直到剩余的人数小于M。请问最后剩余的人在原先的编号为多少?
输入一个整数参数M。
如果输入参数M小于等于1或者大于等于100,输出“ERROR!”;否则按照原先的编号从小到大的顺序,以英文逗号分割输出编号字符串。
我们可以使用模拟的方法来解决这个问题。首先,我们将100个人的编号存储在一个映射表中,编号从1到100。然后,从1开始按顺时针方向报数,每次报数到M时,将对应的编号从映射表中移除。重复这个过程,直到剩余的人数小于M。最后,输出剩余人的编号。
具体步骤如下:
该算法使用模拟的方法解决约瑟夫环变形问题,按照题目要求进行报数和移除操作,直到剩余的人数小于M。最后输出剩余人的编号。算法的时间复杂度主要取决于循环的次数,由于最多循环100次,因此时间复杂度为O(1)。
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.question('请输入参数M:', M => {
const result = josephusProblem(parseInt(M));
console.log(result);
rl.close();
});
function josephusProblem(M) {
if (M <= 1 || M >= 100) {
return 'ERROR!';
}
const map = new Map();
for (let i = 1; i <= 100; i++) {
map.set(i, i);
}
let start = 1;
while (map.size >= M) {
const iterator = map.entries();
for (const [key, value] of iterator) {
map.set(key, start++);
if (value === M) {
map.delete(key);
start = 1;
}
}
}
const result = Array.from(map.keys()).join(',');
return result;
}
下一篇:华为OD机试真题 JavaScript 实现【相对开音节】【2022Q4 100分】,附详细解题思路
本文收录于,华为OD机试(JavaScript)真题(A卷+B卷)
每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。