一. 链表 8 Josephus

2018-04-08  本文已影响0人  何大炮

问题:N个人编号从1到N,围坐成一个圆圈,从s号开始报数,数到第M个人离开圈子,由坐在离开的人的后面的人继续报数,直到圈子只剩下最后一个人。例如:n=9, s =1, m =5,出局人顺序为:5, 1, 7, 4, 3, 6, 9, 2, 8

这题感觉用循环链表最好解决:

class man:
    num = 0
    next_one = None
    def __init__(self, order):
        self.num = order

def delete(parent, grandkid):
    kid = parent.next_one
    parent.next_one = grandkid
    return kid.num

def form_circle(scale):
    parent = man(1)
    head = parent
    for i in range(1, scale):
         next_one = man(i+1)
         parent.next_one = next_one
         parent = next_one
    parent.next_one = head
    return head

def josehus(start, position, amount):
    outcome_sequence = []
    # 第一人
    current = form_circle(amount)
    # 当前对象
    for i in range(1, start):
        current = current.next_one
    # 数数开始的地方
    current_position = start
   # 剩下的人的数量
    left = amount
    while left:
        if current_position == position-1:
            kid = current.next_one
            grand = kid.next_one
            outcome_sequence.append(delete(current, grand))
            current_position = 1
            left -=1
            current = grand
            continue
        current_position +=1
        current = current.next_one
    return outcome_sequence
上一篇 下一篇

猜你喜欢

热点阅读