Пятеро друзей в очереди пьют волшебную колу. Когда первый друг выпивает колу, он исчезает и размножается в двух экземплярах! После этого новые копии отправляются в конец очереди, и следующий друг выпивает волшебную колу, повторяя процесс.
Например, представьте, что у нас есть следующие друзья:
[Sheldon, Leonard, Penny, Rajesh, Howard]
После того, как Шелдон выпьет первую колу, строка будет выглядеть так:
[Leonard, Penny, Rajesh, Howard, Sheldon, Sheldon]
После того, как Леонард выпил колу, фраза становится такой:
[Penny, Rajesh, Howard, Sheldon, Sheldon, Leonard, Leonard]
И так далее...
Моя цель — написать функцию на JavaScript, которая, учитывая массив с именами людей в строке и числом N, вернет имя N-го человека, пьющего волшебную колу.
Так, например, выполнение console.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");
Он даже не перестает работать (занимает вечность).
Итак, очевидно, что мое решение не только неверно, но и кажется неэффективным. Как я могу это исправить?
r
, потому что длина массива продолжает расти. В конце концов,r
станет меньше длины массива, и когда это произойдет, я остановлюсь. - person Flame_Phoenix   schedule 05.04.2016