写一个程序,设有n个人围成一个圈,现从第s个人开始报数,数到第m个的人出列,然后从出列的下一个人重新开始报数,数到第m的人再次出列,如此反复,直到所有的人全部出列为止。对于任意给定的n,s,m,求按出列次序得到的n个人员的序列。
时间: 2023-12-13 07:05:03 浏览: 180
思路:
使用一个循环链表来表示这n个人,每个节点表示一个人,节点的值为人的编号。然后按照题目要求,每次从第s个人开始报数,数到第m个人出列。
具体实现:
1. 创建循环链表,共n个节点,每个节点的值为对应的人的编号。
2. 从第s个节点开始,数m个节点,将该节点从链表中删除,并记录其值。
3. 从删除节点的下一个节点开始,重新开始报数,重复2和3步骤,直到链表为空。
代码实现:
```python
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def josephus(n: int, s: int, m: int) -> List[int]:
# 创建循环链表
head = ListNode(1)
cur = head
for i in range(2, n+1):
node = ListNode(i)
cur.next = node
cur = node
cur.next = head
# 从第s个节点开始报数,数到第m个节点出列
res = []
cur = head # 当前节点
prev = None # 当前节点的前一个节点
for i in range(1, s):
prev = cur
cur = cur.next
while cur.next != cur:
for i in range(1, m):
prev = cur
cur = cur.next
res.append(cur.val)
prev.next = cur.next
cur = prev.next
res.append(cur.val)
return res
```
时间复杂度:$O(nm)$
空间复杂度:$O(1)$
阅读全文