PHP洗牌、猴子选大王两个小算法

时间:2021-01-03 13:19:53

《一》洗牌算法

/**

*洗牌算法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));

————————————————————————————————————————————

以上结果请小伙伴自行打印查看结果,有更好的算法欢迎留言讨论,不喜勿喷哦!!!!

————————————————————————————————————————————