問題の説明
トランプA、2,3 ...... J、Q、K 13枚のスペードの魔術師の手。魔法を実行する前に、マジシャンは、特定の順序の良い(色側のダウンを持っている)プロセスのためのマジックショーでそれらを積み重ねてきた:初め、魔術師数1、その後、カードの上に行くには引き渡さ、スペード、その後、デスクトップ上に置き、2番目は、マジシャン1,2の数、下のカードに最初のカード、2枚目のカードを裏返して、ちょうどスペード2;三度目、魔術師番号1,2,3; 1,2-カードは、これらのカードの底部に変わり、3枚目のカードはわずかスペード3ひっくり返され、......全てまでカードは、これまでに判明している。カードの元の順序はどのように依頼することです。
正しい結果:[1、8、2、5、10、3、12、11、9、4、7、6、13]
ソリューション
1.一覧
def solution_list():
pokers = [0 for _ in range(13)] # 初始化
count = len(pokers) # 纸牌总数
index = -1
for num in range(1, 14):
i = 0 # 计数
while i < num:
index = (index + 1) % count # 索引向前一步(可循环)
if pokers[index] == 0: # 当前元素为0时才计数, 不为0则跳过
i += 1
pokers[index] = num
print('#' * 50)
print(f'\n牌组: {pokers}\n')
print('#' * 50)
2.ラウンドロビンリスト
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 print_all(self):
"""
按顺序打印全部节点
"""
if self.is_empty():
return
p = self.rear.next # 取得头部节点
print('Head', end='')
while True:
print('-->', p.data, end='')
if p is self.rear: # 到达尾部停止
break
p = p.next
print('-->Finish')
def solution_circular_linked_list():
pokers = CircularLinkedList()
for _ in range(13):
pokers.append(0)
temp = pokers.rear
for num in range(1, 14):
i = 0
while i < num:
temp = temp.next
if temp.data == 0:
i += 1
temp.data = num
print('#' * 50)
print('\n牌组: ')
pokers.print_all()
print('\n' + '#' * 50)