1 <?php
2
3 /**************
4 *猴子找大王
5 **************/
6
7 function searchMonkeyKing(int $m, array $monkeys)
8 {
9 // $monkeys = range(1, $n);
10 // print_r($monkeys);
11 // m % n所得的余数就是被踢掉的猴子,然后把后面的数字移位,移到开头继续取余运算。如此循环
12 $len = count($monkeys);
13 $removeIndex = $m % $len == 0 ? ($len - 1) : ($m % $len - 1); //被移除的元素的索引, 取模等于0属于特殊情况
14 // 将被移除元素的下一个元素直到结尾移动到数组开头,被移除元素之前的元素移动到数组结尾(这样做就相当于移位了)
15 $behindMonkeys = array_slice($monkeys, $removeIndex + 1);
16 // print_r($behindMonkeys);
17 unset($monkeys[$removeIndex]);
18 // $frontMonkeys = array_diff($monkeys, $behindMonkeys); //因为这个原数组没有重复的元素,否则不要使用这个函数,会影响结果
19 $frontMonkeys = array_slice($monkeys, 0, $removeIndex); //如果原数组有相同的元素,使用这个函数更保险
20 // print_r($frontMonkeys);
21 // 然后在拼接两个数组,就做到了移位的效果
22 $newMonkeys = array_merge($behindMonkeys, $frontMonkeys);
23 // print_r($newMonkeys);
24 // 接下来可以使用递归,当数组中只有一个元素的时候返回。
25 if (count($newMonkeys) == 1) {
26 $monkeyKing = $newMonkeys[0];
27 } else {
28 $monkeyKing = searchMonkeyKing($m, $newMonkeys);
29 }
30 return $monkeyKing;
31 }
32
33 // print_r(searchMonkeyKing(5, [1,2,3,4,5,6]));
34
35 function generateArray(int $m, int $n)
36 {
37 if ($n <= 1) {
38 return '请输入大于1的整数';
39 }
40 $array = range(1, $n);
41 $monkeyKing = searchMonkeyKing($m, $array);
42 return $monkeyKing;
43 }
44
45 print_r(generateArray(5, 1));