找出大王的问题
有n只猴子围城一个圈,从第1只猴子开始数,每数m只猴子将第当前猴子踢出,如此反复,最后剩下一只猴子就是大王。
/**
* @name king
* @param int m 间隔数
* @param int n 猴子总数
*/
function king(m, n){
/**
queue
{
p:int, //前一只猴子
n:int //后一只猴子
}
*/
var p = {};
p[n] = {
p:n-1,
n:1
};
p[1] = {
p:n,
n:2
};
for(var i=2;i<n;i++){
p[i] = {
p:i-1,
n:i+1
}
};
var i = 0;
var cursor = 1;//cursor
var _n = _p = 0;
while(++i){
if(i==m){
_n = p[cursor].n;
_p = p[cursor].p;
delete p[cursor]; //删除
if(p[_p]==undefined)break;//如果没有下一只猴子即找到了
p[_p].n = _n;
p[_n].p = _p;
cursor = _n;
i = 0;
}else{
cursor = p[cursor].n;
};
};
alert("The king is \r\n"+cursor);
};
抛砖引玉,希望有更好的算法。