0,1,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。
例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。
示例 1:
输入: n = 5, m = 3
输出: 3
示例 2:
输入: n = 10, m = 17
输出: 2
1.比较笨的正常解法
/** 2020.5.4 8:52
* @param {number} n
* @param {number} m
* @return {number}
*/
var lastRemaining = function(n, m) {
let arr = [];
let temp = 0;
for(let i = 0; i < n; i++){
arr[i] = i;
}
while(arr.length!=1){
temp = (temp + m -1)%arr.length;
arr.splice(temp , 1);
}
return arr[0];
}
2.迭代法(约瑟夫环——公式法)
/** 2020.5.4 8:52
* @param {number} n
* @param {number} m
* @return {number}
*/
var lastRemaining = function(n, m) {
let result = 0;
for(let i = 2; i <= n; i++){
result = (result+m)%i;
}
return result;
}
第二个方法,要是没了解过类似的知识,靠临场发挥应该很难想到。
看了一些对约瑟夫环的解释,有一些博文比较通俗易懂,在这记录一下
博文:https://blog.youkuaiyun.com/u011500062/article/details/72855826