本文作者:心月

php取一算法(猴子做大王)过程示例解析

心月IT博客 2020-01-13
php取一算法(猴子做大王)过程示例解析摘要:今天就给大家介绍PHP随机取一算法PHP取一算法,顾名思义用PHP求出多个元素中唯一一个符合要求的元素。

        现在去公司面试很多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的踢出退伍)

php取一算法示例代码运算结果

下面来具体一步一步演算示例代码:(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的猴子,报数结束,结果与示例代码运行结果一致。取一算法示例演算结束。

文章版权及转载声明:

本文由 心月IT技术博客 博主整理于 2020-01-13
若转载请注明原文及出处:https://www.xinyueseo.com/algorithm/596.html

分享到:
赞(
发表评论
快捷输入:

验证码

    评论列表 (有 0 条评论,人围观)参与讨论