题目
0,1,,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。
例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。
示例:
输入: n = 5, m = 3
输出: 3
解题思路
假设当前删除的位置是del ,下一个删除的数字的位置是 del + m 。但是,由于把当前位置的数字删除了,后面的数字会前移一位,所以实际的下一个位置是 del + m - 1。由于存在m>arr.length的情况,所以最后取余一下,就是 (del + m - 1) % arr.length。
实现
var lastRemaining = function(n, m) {
//快速生成0到指定数的数组
var arr = Array.apply(null, Array(n)).map(function(item, i) {
return i;
})
var head = 0;
while(arr.length > 1){
//构造新数组
var len = arr.length;
head = (head + m -1) % len;
arr.splice(head,1);
}
return arr[0];
};