博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【刷算法】孩子们的游戏(圆圈中最后剩下的数)
阅读量:6984 次
发布时间:2019-06-27

本文共 1240 字,大约阅读时间需要 4 分钟。

题目描述

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

分析

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

  1. 简单的实现就是使用环形单链表,一圈一圈的绕,到了号为m的节点就删掉继续绕,最后只剩一个节点时,就可以返回了。
  2. 通过递推出下一次的叫号和编号的关系,来递归操作,详细可以看

代码实现

解法一

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;}复制代码

转载地址:http://pttpl.baihongyu.com/

你可能感兴趣的文章
UNIX环境高级编程笔记之文件I/O
查看>>
DIV+CSS规范命名
查看>>
我的2013 Q.E.D
查看>>
2017 Multi-University Training Contest - Team 9 1002&&HDU 6162 Ch’s gift【树链部分+线段树】...
查看>>
4.5. Rspamd
查看>>
ArcMap中的名称冲突问题
查看>>
(转) 一张图解AlphaGo原理及弱点
查看>>
美联邦调查局 FBI 网站被黑,数千特工信息泄露
查看>>
掉电引起的ORA-1172错误解决过程(二)
查看>>
在网站建设过程中主要在哪几个方面为后期的网站优打好根基?
查看>>
【MOS】RAC 环境中最常见的 5 个数据库和/或实例性能问题 (文档 ID 1602076.1)
查看>>
新年图书整理和相关的产品
查看>>
Struts2的核心文件
查看>>
Spring Boot集成Jasypt安全框架
查看>>
GIS基础软件及操作(十)
查看>>
HDOJ 2041 超级楼梯
查看>>
1108File Space Bitmap Block损坏能修复吗2
查看>>
遭遇DBD::mysql::dr::imp_data_size unexpectedly
查看>>
人人都会设计模式:03-策略模式--Strategy
查看>>
被忽视但很实用的那部分SQL
查看>>