PHP猴子选大王算法(详解)
现在去公司面试很多HR都会让程序猿写一个算法,来考察程序猿的思维逻辑能力。算法对其他的编程语言是很重要的,但是对于php这种弱类的编程语言,算法其实用得并不是很多,但是没办法,HR要让你写,你不得不写,谁叫他是老大呢。好吧,闲话不多说,上代码
/**
* Notes:
* User: Administrator
* Date: 2019/8/22 0022
* Time: 09:44
* @param int $m 猴子数量
* @param int $n 报数的数量
*/
public function monkey($m = 0, $n = 0)
{
//生成猴子的一个数组
$data = range(1, $m);
$d = $m;
//$h为剩余猴子的数量
$h = $m;
for ($i = 1; $i < $d;){
//判断是否可以同时淘汰多只猴子的情况
if($h > $n){
//当剩余的猴子大于了报数的数量的时候开始计算报数轮次,floor:舍去法取整
$x = floor($h/$n);
//计算现在猴子的偏移量
$w = $m - $h;
//计算报数轮次之后剩余猴子的数量
$h = $h - $x * $n;
//利用array_splice的方式可以重新排列的特性
//从后开始踢出猴子可以对于猴子不会影响前面猴子的顺序
for ($j = $x; $j > 0; $j--){
array_splice($data, $w + $n * $j -1, 1);
}
//计算剩下的猴子
$m -= $x;
//计算轮次
$i += $x;
}else{
//计算猴子的队列的偏移量
$y = $n - $h;
//计算猴子淘汰猴子的位置
$c = $y % $m;
//列循环猴子的数量
if($c == 0){
$h = $m - 1;
$c = $m;
}else{
$h = $m - $c;
}
//利用array_splice的方式可以重新排列的特性
array_splice($data, $c - 1, 1);
-- $m;
++ $i;
}
}
dump($data);
}
注:1:$n不能输入1,那样的话没有意义
2:$m数据不能太大,不能超过50000