问题原型:有 500 个小孩围成一圈,编号从 1 到 500 (n),从第一个开始报数:1,2,3,1,2,3,1,2,3,……每次报到 3 (m) 的小孩退出。问第 n 个被淘汰的小孩,在最开始 500 人里是的编号是几?
类似的问题被称为约瑟夫环问题。
约瑟夫环公式推导 :https://www.jianshu.com/p/6ee5c7b21333
第一种解法:
def josephus(n, k, index):
p = 0
count = 0
people = list(range(1, n+1))
while True:
if len(people) == 1:
break
p = (p + k - 1) % len(people)
print 'p=%d--len people=%d' % (p, len(people))
count += 1
if count == index:
print (people[p])
break
print people[p]
del people[p]
第二中解法:使用循环单链表
class LinkNode(object):
def __init__(self, value):
self.value = value
self.next = None
# 创建循环链表
def create_cycle(total):
head = LinkNode(1)
prev = head
index = 2
while total - 1 > 0:
curr = LinkNode(index)
prev.next = curr
prev = curr
index += 1
total -= 1
curr.next = head
return head
def run(total, m, count):
node = create_cycle(total)
while total > 0:
node = node.next
total -= 1
prev = None
start = 1
index = start
while node and node.next:
if index == m:
print ('pop:--%d' % node.value)
prev.next = node.next
node.next = None
node = prev.next
index = start
else:
prev = node
node = node.next
index += 1