现在去公司面试很多HR都会让程序猿写一个算法,来考察程序猿的思维逻辑能力。算法对其他的编程语言是很重要的,但是对于php这种弱类的编程语言,算法其实用得并不是很多,但是没办法,HR要让你写,你不得不写,谁叫他是老大呢。
下面我们就给大家介绍PHP随机取一算法
PHP取一算法,顾名思义用PHP求出多个元素中唯一一个符合要求的元素。
例如,有这样一个php取一算法的具体面试题,问题如下:
一群猴子排成一圈,按1,2,…,n依次编号。然后从第1只开始报数,报数为m的猴子把它踢出圈,然后再次从1开始报数,再报数为m的猴子,在把它踢出去…,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王。
要求用PHP编程模拟此过程,输入猴子的数量n、被踢出的报数,输出最后那个大王的编号。
PHP代码如下:
<?php function king($n, $m){ //把n只猴子编排成 1~n 的数组 $monkeys = range(1, $n); $i=0; //开始报数,直到数组中只剩下一只猴子 while (count($monkeys)>1) { // 1~m 往复报数,可以看成是从 1 一只往后报数 // 报数为 m 的倍数的数即为报数为m 的猴子 // 把报数为 m 的倍数的猴子从数组中踢出去 if(($i+1)%$m==0) { unset($monkeys[$i]); } else { // 报数完没有被踢出的猴子把挪放到数组的最后 array_push($monkeys,$monkeys[$i]); unset($monkeys[$i]); } $i++; } return current($monkeys); } echo king(10,3);
代码运行结果如图:(10只猴子,报数为3的踢出退伍)
下面来具体一步一步演算示例代码:(10只猴子,报数为3的踢出退伍)
1~m 往复报数,可以看成是从 1 一只往后报数,报数为 m 的倍数的数即为报数为m 的猴子,把报数为 m 的倍数的猴子从数组中踢出去
最初的猴子数:
10只猴子,对应编号一次为:1~10
1 2 3 4 5 6 7 8 9 10
第一只猴子报数完毕后:
2 3 4 5 6 7 8 9 10 1
第二只猴子报数完毕后:
3 4 5 6 7 8 9 10 1 2
第三只猴子报数完毕:(报数为3,踢出退伍,从数组中删除)
4 5 6 7 8 9 10 1 2
第四猴子报数完毕:
5 6 7 8 9 10 1 2 4
第五只猴子报数完毕:
6 7 8 9 10 1 2 4 5
第六只猴子报数完毕:(报数6为3的倍数,踢出退伍,从数组中删除)
7 8 9 10 1 2 4 5
第七只猴子报数完毕:
8 9 10 1 2 4 5 7
第八只猴子报数完毕:
9 10 1 2 4 5 7 8
第九只猴子报数完毕:(报数9为3的倍数,踢出退伍,从数组中删除)
10 1 2 4 5 7 8
第十只猴子报数完毕:
1 2 4 5 7 8 10
第一只猴子报数(报数:11)完毕:
2 4 5 7 8 10 1
第二只猴子报数(报数:12)完毕:(报数12为3的倍数,踢出退伍,从数组中删除)
4 5 7 8 10 1
第四只猴子报数(报数:13)完毕:
5 7 8 10 1 4
第五只猴子报数(报数:14)完毕:
7 8 10 1 4 5
第七只猴子报数(报数:15)完毕:(报数15为3的倍数,踢出退伍,从数组中删除)
8 10 1 4 5
第八只猴子报数(报数:16)完毕:
10 1 4 5 8
第十只猴子报数(报数:17)完毕:
1 4 5 8 10
第一只猴子报数(报数:18)完毕:(报数18为3的倍数,踢出退伍,从数组中删除)
4 5 8 10
第四只猴子报数(报数:19)完毕:
5 8 10 4
第五只猴子报数(报数:20)完毕:
8 10 4 5
第八只猴子报数(报数:21)完毕:(报数21为3的倍数,踢出退伍,从数组中删除)
10 4 5
第十只猴子报数(报数:22)完毕:
4 5 10
第四只猴子报数(报数:23)完毕:
5 10 4
第五只猴子报数(报数:24)完毕:(报数24为3的倍数,踢出退伍,从数组中删除)
10 4
第十只猴子报数(报数:25)完毕:
4 10
第四只猴子报数(报数:26)完毕:
10 4
第十只猴子报数(报数:27)完毕:(报数27为3的倍数,踢出退伍,从数组中删除)
4
最后只剩下编号为4的猴子,报数结束,结果与示例代码运行结果一致。取一算法示例演算结束。