有编号1-90号的90个小朋友,围成一个圈 从1号开始报数,1234567循环报数,喊到7的小朋友退出游戏,最后剩下的6个小朋友的编号(例1234567,7号退出,1234567,14号退出。。。),哪位大神帮忙写下,
有编号1-90号的90个小朋友,围成一个圈 从1号开始报数,1234567循环报数,喊到7的小朋友退出游戏,最后剩下的6个小朋友的编号(例1234567,7号退出,1234567,14号退出。。。),哪位大神帮忙写下,
var ss = [];
//学生编号
for(var i=1;i<=90;i++){
ss.push(i);
}
for(var i=1;i<=ss.length,ss.length>6;){
if(i%7==0){
ss.splice(i-7,7);//不为7的已经加到数组后面,已报数的可以全部删除
i=1;//重置i
}else{
ss.push(ss[i-1]);//留下来的学生加到数组后面去
i++;
}
}
console.log(ss);
这个有点像是约瑟夫斯问题
我用数组写了下,不过感觉用链表最好
function array_num(aa,y){
var num=1;
while(aa.length>6){
for(i=0;i<aa.length;i++){
if(num==y){aa[i]=0;num=1;}else{num++}
}
var bb=aa.filter(function(x){if(x){return true}else{return false}})
aa=bb;
}
console.log(aa)
}
array_num(arr,7)//这里的arr是1-90的数组
哈,我试着写一个以array list为基础,空间复杂度比较小(不用重新生成list)但时间复杂度稍大的,逻辑容易懂的。要想空间复杂度和时间复杂度都比较小,最好用 linked list。
"use strict"
function filter(q, order) {
// 本次循环之后留下来的人数
let stayCount = 0
q.forEach((e, i) => {
if (e != null) {
order ++
// 当序数满7,重新开始数
if (order === 7) {
// 赋值为null,即退出下一轮游戏
q[i] = null
order = 0
} else {
// 序数不是7的倍数,留下
stayCount ++
}
}
})
return {
order, // 本次循环之后最后一个人的序号, 如第一次的90 = 84 + 6 = (7*12) + 6,序号是:6
stayCount
}
}
// 初始化一个 1 - 90 的数组
var queue = new Array(90).fill(0).map((e,i) => i+1)
var stay = queue.length
var order = 0
while(stay >= 7) {
let r = filter(queue, order)
stay = r.stayCount
order = r.order
}
console.log(queue.filter((e, i) => e !== null))
10 回答11.2k 阅读
5 回答4.9k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
代码是写出来,思想也写出来了,不过貌似不是很好懂,自己用小数据来算一下应该能明白吧。90 个人算出来答案是
[ 15, 48, 53, 64, 73, 85 ]
,不知道对不对。