问题描述

N个人围成一个圈, 从第一个人开始报数, 报到M的人出圈, 剩下的人继续从1开始报数, 报到M的人出圈;如此往复, 直到所有人出圈.

列表解决

def solution_list(n, m):
"""
初始化一个长度为n的列表, 默认值为True. 当某个元素出圈时, 将其置为False.
循环迭代这个列表, 遇到值为False的元素则跳过, 当列表中全为False时表示所有人
都已出圈.
"""
# 初始化列表
people = []
for _ in range(n):
people.append(True) result = []
num = 1
while any(people):
for index, p in enumerate(people):
if p:
if num == m: # 出圈操作
people[index] = False
result.append(index + 1)
num = 1
else:
num += 1
print('-' * 25)
print(f'\n总人数为{n}, 报数为{m}')
print(f'约瑟夫序列为:\n {result}\n')
print('-' * 25)
def solution_list2(n, m):
"""
这是上面这种思路的另一种解法, 将圈内和圈外表示成0和1.
这里实现循环迭代的方式我第一次遇到, 记录一下
"""
people = [0 for _ in range(n)] alive = n # 剩余人数
index = 0
num = 0 # 计数器, 当index == m时出圈
result = [] while alive > 0:
num += 1 - people[index] # 每轮到一个人报数, 不论0或1都进行计数
if num == m:
result.append(index + 1) # 出圈
people[index] = 1 # 将出圈人置为 1
alive -= 1 # 剩余人数 - 1
num = 0 # 重置计数器 # 与总人数 n 取余, 可以实现index在 0 ~ count -1之间一直循环, 达到循环迭代的目的
index = (index + 1) % n print('-' * 25)
print(f'\n总人数为{n}, 报数为{m}')
print(f'约瑟夫序列为:\n {result}\n')
print('-' * 25)

循环链表解决

class Node:
"""节点"""
def __init__(self, value):
self.data = value
self.next = None def __repr__(self):
return f'Node: {self.data}' class CircularLinkedList:
"""循环链表"""
def __init__(self):
self.rear = None # 尾节点 def is_empty(self):
return self.rear is None def append(self, elem):
"""尾插法"""
temp = Node(elem)
if self.rear is None:
temp.next = temp
self.rear = temp
else:
temp.next = self.rear.next
self.rear.next = temp
self.rear = temp def solution_circular_linked_list(n, m):
"""
通过循环链表解决, 每次出圈弹出该节点
"""
clist = CircularLinkedList()
for i in range(n):
clist.append(i + 1) result = []
pre = clist.rear # 当前节点的上一个节点
cur = clist.rear.next # 当前节点
num = 0 # 计数器 while cur.next is not cur:
num += 1
if num == m: # 出圈
result.append(cur.data)
pre.next = cur.next # 弹出当前节点
num = 0 # 重置计数器
else:
pre = pre.next
cur = cur.next
result.append(cur.data) print('-' * 25)
print(f'\n总人数为{n}, 报数为{m}')
print(f'约瑟夫序列为:\n {result}\n')
print('-' * 25)

参考:

经典算法--约瑟夫环问题的三种解法

百度百科

约瑟夫问题 -- python实现的更多相关文章

  1. 简洁之美 -约瑟夫环的python 解法

    问题描述: 约瑟夫环问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到k的那个人出列:他的下一个人又从1开始报数,数到k的那个人又出列:依此规律重复下 ...

  2. 约瑟夫环问题及python与c++实现效率对比

    约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重 ...

  3. python中使用queue实现约瑟夫环(约瑟夫问题)求解

    约瑟夫问题:是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围. 从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又出列: 依 ...

  4. 10行Python代码解决约瑟夫环(模拟)

    http://blog.csdn.net/dengyaolongacmblog/article/details/39208675 #!/usr/bin/env python # coding: utf ...

  5. 丢手绢问题(约瑟夫问题)的python实现

    约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉. def fnA(p, personNum, cnt): times = cnt // pe ...

  6. python - 约瑟夫问题

    在罗马人占领乔塔帕特后,39 个犹太人与约瑟夫及他的朋友躲到一个洞中.39个犹太人决定宁愿死也不要被敌人俘虏,商定一种特殊的方式自杀,41个人排成一个圆圈,由第1个人开始报数,每报到第3人该人就必须自 ...

  7. Python练习——约瑟夫环问题、用类方法描述一个数字时钟

    一.约瑟夫环问题 有15个基督徒和15个非基督徒在海上遇险,为了能让一部分人活下来不得不将其中15个人扔到海里面去,有个人想了个办法就是大家围成一个圈,由某个人开始从1报数,报到9的人就扔到海里面,他 ...

  8. python算法:约瑟夫问题

    据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特後,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被人抓到,于是决定了一个自杀方式,41 ...

  9. 浅谈如何使用python抓取网页中的动态数据

    我们经常会发现网页中的许多数据并不是写死在HTML中的,而是通过js动态载入的.所以也就引出了什么是动态数据的概念, 动态数据在这里指的是网页中由Javascript动态生成的页面内容,是在页面加载到 ...

随机推荐

  1. Win10 SQLServer 未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序

    环境:Win10+SQLServer2014 场景:在SQLServer导入Excel时,选择Excel2007格式,提示:未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供 ...

  2. X86架构CPU常识(主频,外频,FSB,cpu位和字长,倍频系数,缓存,CPU扩展指令集,CPU内核和I/O工作电压,制造工艺,指令集,超流水线与超标量)

    1.主频 主频也叫时钟频率,单位是MHz,用来表示CPU的运算速度. CPU的主频=外频×倍频系数.很多人认为主频就决定着CPU的运行速度,这不仅是个片面的,而且对于服务器来讲,这个认识也出现了偏差. ...

  3. MySQL 库、表、记录、相关操作(2)

    库.表.记录.相关操作(2) 字段操作 create table tf1( id int primary key auto_increment, x int, y int ); # 修改 alter ...

  4. 磁盘格式化、磁盘挂载、手动增加swap空间 使用介绍

    第4周第2次课(4月10日) 课程内容: 4.5/4.6 磁盘格式化4.7/4.8 磁盘挂载4.9 手动增加swap空间 4.5/4.6 磁盘格式化 [root@jimmylinux-002 ~]# ...

  5. expect脚本同步文件、expect脚本指定host和要同步的文件、构建文件分发系统、批量远程执行命令

    7月20日任务 20.31 expect脚本同步文件20.32 expect脚本指定host和要同步的文件20.33 构建文件分发系统20.34 批量远程执行命令扩展:shell多线程 http:// ...

  6. Erlang/Elixir精选-第2期(20191209)

    Spot The Discrepancies with Dialyzer for Erlang. 如何在大型Erlang项目中从零开始一步步践行Dialyzer. Which companies ar ...

  7. 为什么现在使用多周期CPU,而单周期CPU被弃用?

    最初设计的CPU结构简单,内部不复杂.之所以制造它是为了让机器自动跑程序,算数. 早期CPU都是单周期的,人们没考虑那么多,性能啥的.就让CPU每个时钟周期跑一个指令,这些时钟周期等长.这样下来,有的 ...

  8. error Couldn't find a package.json file in

    error Couldn't find a package.json file in解决方法:首先初始化,再安装相应的文件 (1). npm init -f //强迫初始化文件 (2). npm in ...

  9. 使用Carthage集成Alamofire

    Carthage相较于Cocoapods有着使用灵活,对目标工程改动小的优势,使得它越来越受欢迎.今天就对我使用Carthage集成FBSDK做一个记录. 1.首先https://github.com ...

  10. [TimLinux] TCP全连接队列满

    0. TCP三次握手 该图来自:TCP SOCKET中backlog参数的用途是什么? syns queue: 半连接队列 accept queue: 全连接队列 控制参数存放在文件:/proc/sy ...