php面试题猴子123报数(猴子选大王)

题目就是有N个猴子,123循环报数数到3的猴子被踢出下一个接着报数,一遍一遍的循环直到剩余一个猴子,求这个猴子是最开始的第几号猴子。

我想到了两个方法

第一个就是模拟报数的模式 每到3的时候unset一个元素 最后剩余的就是 要求的猴子。

代码大概是这个样子:

<?php
$num = 0;
$arr = array(1,2,3,4,5,6);
while(count($arr) != 1){
    foreach($arr as $k=>$v){
        if($num == 2){
            unset($arr[$k]);
            $num = 0;
        }else{
            $num++;
            //echo  $num,'---',$v,"\n";
        }
    }
}

var_dump($arr);
die;

第二种方式就是既然是数到三踢出 这样的话我就直接每三个位置一删除 删除之后会剩下0 或者1 或者2个猴子

因为肯定要从剩下的猴子开始报数 剩下的猴子也就相当于是队伍的开始

这个时候在把剩下的猴子移动到队伍的头部 再执行每三个位置一删除  剩下的猴子移到队伍头部。。。。 是不是就是一个递归那????

so:

<?php
//重排数组
function randArray($arr,$num){
    $res = array_splice($arr,$num);
    return array_merge($res,$arr);
}
//删除第三位
function unsetArray($arr){
    $num = count($arr);
    $i   = 2;
    if($num>2){
        while($num >= ($i+1)){
            unset($arr[$i]);
            $i += 3;
        }
    }
    $arr = array_values($arr);
}

function checkMonk($arr){
    $num = count($arr);
    if($num == 2){
        return $num[1];
    }
    $num  = count($arr) % 3;
    $arr = unsetArray($arr);
    $arr = randArray($arr,$num);
    return checkMonk($arr);
}

$arr = array(1,2,3,4,5,6);
echo checkMonk($arr);

大概就是这样。。。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

__DEBUG__

来杯可乐

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值