面试题(程序03)

  1. 猴子找大王
    <?php
    
    /**************
     *猴子找大王
    **************/
    
    function searchMonkeyKing(int $m, array $monkeys)
    {
        // $monkeys = range(1, $n);
        // print_r($monkeys);
        // m % n所得的余数就是被踢掉的猴子,然后把后面的数字移位,移到开头继续取余运算。如此循环
        $len = count($monkeys);
        $removeIndex = $m % $len == 0 ? ($len - 1) : ($m % $len - 1); //被移除的元素的索引, 取模等于0属于特殊情况
        // 将被移除元素的下一个元素直到结尾移动到数组开头,被移除元素之前的元素移动到数组结尾(这样做就相当于移位了)
        $behindMonkeys = array_slice($monkeys, $removeIndex + 1);
        // print_r($behindMonkeys);
        unset($monkeys[$removeIndex]);
        // $frontMonkeys = array_diff($monkeys, $behindMonkeys);  //因为这个原数组没有重复的元素,否则不要使用这个函数,会影响结果
        $frontMonkeys = array_slice($monkeys, 0, $removeIndex);  //如果原数组有相同的元素,使用这个函数更保险
        // print_r($frontMonkeys);
        // 然后在拼接两个数组,就做到了移位的效果
        $newMonkeys = array_merge($behindMonkeys, $frontMonkeys);
        // print_r($newMonkeys);
        // 接下来可以使用递归,当数组中只有一个元素的时候返回。
        if (count($newMonkeys) == 1) {
            $monkeyKing = $newMonkeys[0];
        } else {
            $monkeyKing = searchMonkeyKing($m, $newMonkeys);
        }
        return $monkeyKing;
    }
    
    // print_r(searchMonkeyKing(5, [1,2,3,4,5,6]));
    
    function generateArray(int $m, int $n)
    {
        if ($n <= 1) {
            return ‘请输入大于1的整数‘;
        }
        $array = range(1, $n);
        $monkeyKing = searchMonkeyKing($m, $array);
        return $monkeyKing;
    }
    
    print_r(generateArray(5, 1));

    猴子找大王

相关推荐