题目:
- 现有 n 只猴子围坐成一个圈,按顺时针方向从1到n编号。
然后从1号猴子开始沿顺时针方向从1开始报数,报到m的猴子出局,继续从刚出局猴子的下一个位置重新从1开始报数,报到m猴子出局。如此循环重复,直至剩下一个猴子,它就是大王。
算法:
- 思路:利用数组队列, m 的直接从数组去除,不是 m 的排到数组队列的最后面,然后删除其在原数组中的位置;
//$n 个数 $m 第几个出局
function findMonkeyKing($n,$m){
$monkeys = range(1, $n);
$i = 0;
if($n < 1){
return '';
}
while (count($monkeys) > 1){
//如果$i除余等于0,那么不需要push,直接unset出局
if (($i+1)%$m != 0) {
array_push($monkeys, $monkeys[$i]);
}
unset($monkeys[$i]);
$i++;
}
return current($monkeys);
}
//假设现在100只猴子,数到7的出局;
echo findMonkeyKing(100,7);
//运行结果为:50