PHP猴子选大王算法(详解)

PHP猴子选大王算法(详解)

现在去公司面试很多HR都会让程序猿写一个算法,来考察程序猿的思维逻辑能力。算法对其他的编程语言是很重要的,但是对于php这种弱类的编程语言,算法其实用得并不是很多,但是没办法,HR要让你写,你不得不写,谁叫他是老大呢。好吧,闲话不多说,上代码
/**
     * Notes:
     * User: Administrator
     * Date: 2019/8/22 0022
     * Time: 09:44
     * @param int $m 猴子数量
     * @param int $n 报数的数量
     */
    public function monkey($m = 0, $n = 0)
    {
        //生成猴子的一个数组
        $data = range(1, $m);
        $d = $m;
        //$h为剩余猴子的数量
        $h = $m;
        for ($i = 1; $i < $d;){
            //判断是否可以同时淘汰多只猴子的情况
            if($h > $n){
                //当剩余的猴子大于了报数的数量的时候开始计算报数轮次,floor:舍去法取整
                $x = floor($h/$n);
                //计算现在猴子的偏移量
                $w = $m - $h;
                //计算报数轮次之后剩余猴子的数量
                $h = $h - $x * $n;
                //利用array_splice的方式可以重新排列的特性
                //从后开始踢出猴子可以对于猴子不会影响前面猴子的顺序
                for ($j = $x; $j > 0; $j--){

                    array_splice($data, $w + $n * $j -1, 1);
                }
                //计算剩下的猴子
                $m -= $x;
                //计算轮次
                $i += $x;
            }else{
                //计算猴子的队列的偏移量
                $y = $n - $h;
                //计算猴子淘汰猴子的位置
                $c = $y % $m;
                //列循环猴子的数量
                if($c == 0){
                    $h = $m - 1;
                    $c = $m;
                }else{
                    $h = $m - $c;
                }
                //利用array_splice的方式可以重新排列的特性
                array_splice($data, $c - 1, 1);
                -- $m;
                ++ $i;
            }
        }

        dump($data);
    }

注:1:$n不能输入1,那样的话没有意义

2:$m数据不能太大,不能超过50000

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值