约瑟夫环2

原创 2018年04月17日 21:43:46

问题描述:

有n个人站成一列。并从头到尾给他们编号,第一个人编号为1。然后从头开始报数,第一轮依次报1,2,1,2...然后报到2的人出局。接着第二轮再从上一轮最后一个报数的人开始依次报1,2,3,1,2,3...报到2,3的人出局。以此类推直到剩下以后一个人。现在需要求的即是这个人的编号

1 2 1 2 …1 2 31 2 3 ….1 2 3 4 1 2 3 4….1 2 3 4 5 1 2 3 4 5 …..知道最后只剩下一个元素】


 举个例子:假设n = 24,第一个人编号为1。
(1)第一轮:依次报1,2,1,2...然后报到2的人出局,则第一轮过后未出局的编号为1、3、5、7、9、11、13、15、17、19、21、23;
(2)第二轮:从上一轮最后一个报数的人开始依次报1,2,3,1,2,3...报到2,3的人出局。我这里做的处理是,先将上一轮最后一个报数的编号移动到最前面,即23、1、3、5、7、9、11、13、15、17、19、21;然后开始第二轮报数,未出局的编号为23、5、11、17;
(3)第三轮:从上一轮最后一个报数的人开始依次报1,2,3,4,1,2,3,4...报到2,3,4的人出局。同样,我这里做的处理是,先将上一轮最后一个报数的编号移动到最前面,即17、23、5、11;然后开始第三轮报数,未出局的编号为17,此时链表中仅剩一个节点,故程序结束。

解题思路:

将编号 1 - n放入到列表中,当列表中的元素个数大于1的时候进行循环:第二轮循环:【每一轮循环表示一次报数过程】设置变量round并计算当前编号的所报的数字【(cur+1)%roud】,进行判断:如果所报的数字是1,则继续下一个数字;如果所报的数字不是1,则执行列表的删除操作。执行完一轮报数的过程后,需要将左后一个数字移动到列表的第一个位置(题意:从上次报数的最后一个开始报编号1)【利用列表中的 pop()方法:默认删除最后一个元素,并返回最后一个元素的值 】,最后跳出循环并返回列表中唯一一个元素

# -*- coding:utf-8 -*-
class Joseph:
    def getResult(self, n):
        # write code here
        if n < 0:
            return -1
        list1 = []
        i , cur = 0,0
        roud = 2
        for i in range(1,n+1):# 将编号加入到列表中
            list1.append(i)
        while len(list1) > 1:
            i = 0
            while len(list1) > 1 and i < len(list1):
                cur = (cur + 1)%roud # 计算出当前所报的数字
                if cur == 1:# 判断如果数字为1,不进行处理
                    i += 1
                else: # 如果数字不是1,进行删除操作
                    list1.remove(list1[i])
            roud += 1
            cur = 0
            if len(list1) > 1:
                list1.insert(0,list1.pop())# 将最后一个元素删除并插入到首位
        return list1.pop()

约瑟夫环问题(二):(难度:2颗星)

问题描述:编号为1,2,…,n的n个人按顺时针方向围坐一圈,任选一个正整数作为报数上限m,从第一个人开始按顺时针方向从自1开始顺序报数,报道m时停止报数.报m的人出列,从他的顺时针方向上的下一个人开始...
  • yi_ming_he
  • yi_ming_he
  • 2017-06-04 17:02:09
  • 10774

约瑟夫环数学算法的优化(转)

约瑟夫环数学算法的优化(转) 问题描述:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又...
  • u010781856
  • u010781856
  • 2015-06-23 22:19:29
  • 993

基本约瑟夫环问题详解

基本问题描述: 已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为1的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆...
  • liujian20150808
  • liujian20150808
  • 2016-03-18 22:40:41
  • 5807

约瑟夫环(约瑟夫问题的变形,LA 3882)

只是问最后剩下的是哪个,而没有问具体是怎么删除的,所以不需要完全模拟,只需要模拟编号就好了。 一开始有n个,分别编号为   0,1,2,3,...n-1。 删除第k个,即编号为k-1的那个...
  • xl2015190026
  • xl2015190026
  • 2016-10-27 23:51:04
  • 421

约瑟夫环的O(n)解决算法

问题 :已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围...
  • wenlei_zhouwl
  • wenlei_zhouwl
  • 2010-10-19 22:30:00
  • 1491

约瑟夫环的问题与应用(JAVA)

[编程题] 删数 有一个数组a[N]顺序存放0-N,要求没隔两个数删掉一个数,到末尾时循环至开头继续进行,求最后一个被删掉的数的原始下标位置。以8个数(N=7)为例:{0,1,2,3,4,5,6,...
  • hll174
  • hll174
  • 2016-04-07 17:11:21
  • 1551

约瑟夫环问题 java代码实现(高效率)

问题来历编辑 据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决...
  • uniquewonderq
  • uniquewonderq
  • 2015-06-13 19:27:55
  • 1712

约瑟夫环之二(用递归的思想解决Josephus问题)

原来写过一篇关于约瑟夫问题的链表实现解法 ,刷九度题到http://ac.jobdu.com/problem.php?pid=1356 时,再次遇到这个问题,记下用递归思想解决约瑟夫问题的方法: 初始...
  • wusuopuBUPT
  • wusuopuBUPT
  • 2014-01-13 10:09:09
  • 8627

九度OJ 题目1188:约瑟夫环

题目1188:约瑟夫环 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:689 解决:303 题目描述:     N个人围成一圈顺序...
  • SJF0115
  • SJF0115
  • 2013-02-14 18:38:07
  • 1565

JAVA求解约瑟夫环

1、引言 与前面我们介绍的大所属
  • ljtyzhr
  • ljtyzhr
  • 2014-09-11 10:41:04
  • 1441
收藏助手
不良信息举报
您举报文章:约瑟夫环2
举报原因:
原因补充:

(最多只允许输入30个字)