• 《剑指offer》-孩子们的游戏(圆圈中最后剩下的数)


    每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0...m-1报数....这样下去....直到剩下最后一个小朋友,可以不用表演,并且拿到牛客名贵的“名侦探柯南”典藏版(名额有限哦!!^_^)。请你试着想下,哪个小朋友会得到这份礼品呢?(注:小朋友的编号是从0到n-1)

    坑爹的题目描述,细节都不讲清楚。当输入n=0,m=0的时候,要输出什么?题目没有给,测试用例显示为-1。

    思路是用递归,将第n次的问题转化为第n-1次的问题的结果,再做一个编号的变换。比如第一次执行后,编号m%n-1的出局,下一次从编号m%n的开始,这个编号又可以当作子问题“n-1个人玩这个游戏,参数为m”的编号为0的元素。那么n-1规模问题的解加入知道了为x,则对应到规模为n的问题上她的编号就是x'=(x+m)%n。

    递归出来的表达式就是:f(1)=0, f(i)=(f(i-1)+m)%i
    然后加上坑爹的f(0)=-1

    递归写法:

    class Solution{
    public:
    	int LastRemaining_Solution(int n, int m){
    		if (n == 1){
    			return 0;
    		}
    		int t = LastRemaining_Solution(n - 1, m);
    		int result = (t + m) % n;
    		return result;
    	}
    };
    

    迭代写法:

    class Solution{
    public:
    	int LastRemaining_Solution(int n, int m){
            if(n==0){
                return -1;
            }
    		int s=0;
           for(int i=2;i<=n;i++){
               s=(s+m)%i;
           }
           return s;
    	}
        
    
    };
    
    
  • 相关阅读:
    第十一周上机
    第十周上机
    第九周上机
    第八周作业
    课程学习总结报告
    结合中断上下文切换和进程上下文切换分析Linux内核的一般执行过程
    深入理解系统调用
    基于 mykernel 2.0 编写一个操作系统内核
    交互式多媒体图书平台的设计与实现
    码农的自我修养之必备技能 学习笔记
  • 原文地址:https://www.cnblogs.com/zjutzz/p/6615967.html
Copyright © 2020-2023  润新知