fujuan000 2020-05-31
<?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));
猴子找大王