猴子选大王

yuyu888 于 2022-02-24 发布

题目

M只猴子要选大王,选举办法如下:所有猴子按1,2……n编号围成一圈,从第一号开始顺序1,2……m,凡是报m号的退出圈外, 如此循环报数直到圈内只剩一只猴子时这只猴子就是大王。

用数组模拟一个环

以下是网上的提供的方案, 很简单明了

function mk($n ,$m){
        $arr = range(1,$n);//构造一个数组
        $i = 1; //从第一个开始循环
        while(count($arr)>1){ //如果总数大于1
            ($i % $m != 0) && array_push($arr,$arr[$i-1]);//不被踢出则压入数组尾部
            unset($arr[$i-1]);//压入数组然后删除
            $i++;//继续循环
        }  
        return $arr[$i-1]; //直至最后剩下一个为大王 
}
print_r(mk(6,8));   //第3只为大王

递归报数

自己实现了一个,主要用递归方式实现, 思想上更加贴合题目描述, 就是不断报数


<?php
function dotask($array, $m, $begin){
	if(count($array)==1){
		return $array;
	}
// 	echo $begin;
// 	print_r($array);
	$i=$begin;
	foreach($array as $key=>$a){
		if($i==$m){
			unset($array[$key]);
			$i=0;
		}
		$i++;
	}
	$arr = dotask($array, $m, $i);
	return $arr;
}

$n = 9;
$array = range(1,$n);//构造一个数组

$arr = dotask($array, 7, 1);
echo '======';
print_r($arr);
?>