题目就是有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);
大概就是这样。。。