Loading

PHP版的猴子选大王算法

猴子选大王

这个算法可能是目前我看到的最简洁都算法吧,而且很好理解。它不同于其他算法,其他算法都是判断这个猴子能不能被选中,而他只是找出不能被选中的猴子,然后将其塞到数组模拟的环状队列中,参与下次选。

<?php

/**
 * 本题的重点是,如果猴子所在的位置数不能被m整除,那么这个猴子就不会被踢出,
 * 会参加下一轮的循环
 * @param $n int n个猴子参与
 * @param $m int 踢出第m个猴子
 * @return int
 */
function getKing(int $n, int $m): int
{
    $arr = range(1, $n);// 为n个猴子排序
    $i = 0;
    // 只剩一个猴子时返回,它就是王
    while (count($arr) > 1) {
        // 猴子的个数从1开始数
        if (($i + 1) % $m != 0) {// 如果猴子的编号不能被$m整除,就说明数m个数,它不会被数中
            array_push($arr, $arr[$i]);// 猴子移到数组尾部,参与下次数数
        }
        unset($arr[$i]);// 踢出这个猴子
        $i++;
    }

    return array_shift($arr);
}

echo(getKing(10, 4));
posted @ 2021-03-10 23:04  哈利路亚健儿奋起步伐  阅读(122)  评论(0编辑  收藏  举报