《一》洗牌算法
/**
*洗牌算法washCard
*@param $cardNum
*@return array
*/
function washCard($cardNum)
{
$cards = range(1, $cardNum);
for ($i = $cardNum - 1; $i > 0; $i--) {
$rnd = rand(0, $i - 1);
list($cards[$rnd], $cards[$i]) = array($cards[$i], $cards[$rnd]);
}
return $cards;
}
print_r(washCard(54));
《二》猴子选大王
/**
*思路:循环数组判断取出的每一个值是否是m的倍数,如果是剔除掉。如果不是push到数组队尾。算法复杂度:O(n)
*@param $n
*@param $m
*/
function monkeySelectKing($n, $m)
{
$monkey = range(1, $n)
$i = 0;
while(count($monkey) > 1) {
$i += 1;
$head = array_shift($monkey);//踢出
if ($i % $m != 0) {
//当前取到的这个如果不是m的倍数,就把这个值放回去
array_push($monkey, $head);
}
}
return $mokey[0];
}
$n = 11;
$m = 3;
print_(monkeySelectKing($n, $m));
————————————————————————————————————————————
以上结果请小伙伴自行打印查看结果,有更好的算法欢迎留言讨论,不喜勿喷哦!!!!
————————————————————————————————————————————