五个朋友排成一排喝着神奇的可乐。当第一个朋友喝了可乐,他就消失了,并变成了两份!之后,这些新副本排到最后,下一个朋友喝了魔法可乐,重复这个过程。
例如,假设我们有以下朋友:
[Sheldon, Leonard, Penny, Rajesh, Howard]
在 Sheldon 喝完第一杯可乐后,这条线将如下所示:
[Leonard, Penny, Rajesh, Howard, Sheldon, Sheldon]
伦纳德喝下可乐后,台词变成了这样:
[Penny, Rajesh, Howard, Sheldon, Sheldon, Leonard, Leonard]
等等...
我的目标是用 JavaScript 编写一个函数,给定一个数组,其中包含一行中的人的姓名和一个数字 N,它将返回第 N 个喝魔法可乐的人的姓名。
因此,例如,doingconsole.log(whoIsNext([Sheldon, Leonard, Penny, Rajesh, Howard], 1))
应该返回Sheldon
。
为此,我编写了以下代码:
function whoIsNext(names, r){
var fistInLine;
if(r <= names.length){
return names[r-1];
}else{
while(r > names.length){
fistInLine = names.shift();
names.push(fistInLine, fistInLine);
}
return names[r-1];
}
}
此功能适用于以下情况:
names = ["Sheldon", "Leonard", "Penny", "Rajesh", "Howard"];
Test.assertEquals(whoIsNext(names, 1), "Sheldon");
但它未能通过测试:
names = ["Sheldon", "Leonard", "Penny", "Rajesh", "Howard"];
Test.assertEquals(whoIsNext(names, 52), "Penny");
如果我尝试使用一个非常大的数字,例如:
names = ["Sheldon", "Leonard", "Penny", "Rajesh", "Howard"];
Test.assertEquals(whoIsNext(names, 7230702951), "Leonard");
它甚至不会停止运行(永远需要)。
很明显,我的解决方案不仅不正确,而且似乎也无能为力。我该如何解决?