• 猴子选大王【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;
        }
    
  • 相关阅读:
    二叉堆(最小堆, 最大堆)介绍与实现
    C++ 用变量定义数组
    C++ 用变量定义数组
    053185
    053184
    053183
    053182
    053181
    053180
    oracle prior
  • 原文地址:https://www.cnblogs.com/followyou/p/9334245.html
Copyright © 2020-2023  润新知