javascript实现圆圈中最后剩下的数字

283 阅读1分钟

题目

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];
};