• 猴子选大王【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;
        }
    
  • 相关阅读:
    利用dockerfile定制镜像
    发布Docker 镜像到dockerhub
    Docker 停止容器
    133. Clone Graph
    132. Palindrome Partitioning II
    131. Palindrome Partitioning
    130. Surrounded Regions
    129. Sum Root to Leaf Numbers
    128. Longest Consecutive Sequence
    127. Word Ladder
  • 原文地址:https://www.cnblogs.com/followyou/p/9334245.html
Copyright © 2020-2023  润新知