资讯专栏INFORMATION COLUMN

【刷算法】孩子们的游戏(圆圈中最后剩下的数)

王伟廷 / 2924人阅读

摘要:题目描述每年六一儿童节牛客都会准备一些小礼物去看望孤儿院的小朋友今年亦是如此。作为牛客的资深元老自然也准备了一些小游戏。其中有个游戏是这样的首先让小朋友们围成一个大圈。然后他随机指定一个数让编号为的小朋友开始报数。

题目描述

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

分析

这是个约瑟夫环的问题,可以上网查查,很经典的题目

简单的实现就是使用环形单链表,一圈一圈的绕,到了号为m的节点就删掉继续绕,最后只剩一个节点时,就可以返回了。

通过递推出下一次的叫号和编号的关系,来递归操作,详细可以看约瑟夫环

代码实现 解法一
function node(x){
    this.val = x;
    this.next = null;
}

function LastRemaining_Solution(n, m)
{
    if(n < 1 || m < 1)
        return -1;
    // 构造环形单链表
    var head;
    var last;
    for(var i = 0;i < n;i++) {
        if(i === 0){
            head = new node(i);
            last = head;
        }else{
            var temp = new node(i);
            last.next = temp;
            last = temp;
        }
    }
    
    last.next = head;
    
    var count = 0;
    while(last !== head) {
        if(++count === m){
            last.next = head.next;
            count = 0;
        }else{
            last = last.next;
        }
        head = head.next;
    }
    
    return head.val;
}
解法二
function LastRemaining_Solution(n, m)
{
    if(n==0)
        return -1;
    if(n==1)
        return 0;
    else
        return (LastRemaining_Solution(n-1,m)+m)%n;
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/96352.html

相关文章

  • 儿子着迷游戏,程序员父亲辞职创业带火了少儿编程培训

    摘要:岁的余宙华是少儿编程培训机构阿儿法营的创办者,也是这个培训机构课程体系的主要研发者。如今少儿编程培训行业正越来越热,最近几年国内的少儿编程培训机构雨后春笋般一个个地冒出来。这时,余宙华意识到是他作为父亲出手的时候了。 什么是计算机的灵魂?余宙华用孩子式的语气问长桌旁坐着的小女孩。 小女孩认真地想了半天,有些腼腆地犹豫着给出了余宙华期待的答案:程序。 2018年7月,我在阿儿法营海淀人大...

    kidsamong 评论0 收藏0
  • Josephus Problem的详细算法及其Python、Java实现

    摘要:然而和他的朋友并不想遵从,要他的朋友先假装遵从,他将朋友与自己安排在第个与第个位置,于是逃过了这场死亡游戏。问最后一个人的最开始的编号是几先是笔者的朴素想法。这种想法虽然素朴,比较容易实现,但是时间复杂度为接着是数学方法。   笔者昨天看电视,偶尔看到一集讲述古罗马人与犹太人的战争——马萨达战争,深为震撼,有兴趣的同学可以移步:http://finance.ifeng.com/a/20...

    big_cat 评论0 收藏0
  • Josephus Problem的详细算法及其Python、Java实现

    摘要:然而和他的朋友并不想遵从,要他的朋友先假装遵从,他将朋友与自己安排在第个与第个位置,于是逃过了这场死亡游戏。问最后一个人的最开始的编号是几先是笔者的朴素想法。这种想法虽然素朴,比较容易实现,但是时间复杂度为接着是数学方法。   笔者昨天看电视,偶尔看到一集讲述古罗马人与犹太人的战争——马萨达战争,深为震撼,有兴趣的同学可以移步:http://finance.ifeng.com/a/20...

    yimo 评论0 收藏0

发表评论

0条评论

王伟廷

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<