猴子选大王【PHP】

猴子选大王

一群猴子排成一圈,按1,2,...,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去...,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入m、n,输出最后那个大王的编号。

指针解决

思考了下,发现数组指针最适合解决这个问题,解决方法:

function monkeyKing($m,$n){
    $arr = range(1,$n);
    $i = 1;
    while( count($arr)>1 ){

        //移动指针,如果是底部移向顶部
        if( $i>1 && empty($SF) ){
            $sta = next($arr);
            if( !$sta ){
                reset($arr);
            }
            $sta = current($arr);
        }

        $SF = 0;

        //去除m倍数的值,如果是底部移向顶部,并做标记
        if( $i%$m==0 ){
            if(!next($arr)){
                reset($arr);
                current($arr);
            }

            $key = array_search($sta, $arr);    //获取key
            unset($arr[$key]);
            $SF = 1;
        }
        $i++;
    }

    return array_pop($arr);
}

测试数据:

print_r( monkeyKing(1,3));      //返回 3
print_r( monkeyKing(4,4));      //返回 2
print_r( monkeyKing(3,10));      //返回 4

挺有意思。

数组压栈

function monkeyKing( $m , $n ){
        $arr = range(1,$n);

        $i = 1;
        //for循环 数组压栈数据不计入,遍历结束重新遍历
        while(  count($arr)!=1 ){
            foreach ($arr as $k => $v){
                unset($arr[$k]);
                if( $i%$m!=0 ){
                    array_push($arr,$v);
                }
                $i++;
            }
        }
        return $arr;
    }
posted @ 2018-07-19 10:12  walkingSun  阅读(204)  评论(0编辑  收藏  举报
**/