python随机发牌_魔术师发牌问题 -- python实现
問題描述
魔術師手中有A、2、3……J、Q、K十三張黑桃撲克牌。在表演魔術前,魔術師已經將他們按照一定的順序疊放好(有花色的一面朝下).魔術表演過程為:一開始,魔術師數1,然后把最上面的那張牌翻過來,是黑桃A;然后將其放到桌面上;第二次,魔術師數1、2;將第一張牌放到這些牌的最下面,將第二張牌翻轉過來,正好是黑桃2;第三次,魔術師數1、2、3;將第1、2張牌依次放到這些牌的最下面,將第三張牌翻過來正好是黑桃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)
總結
以上是生活随笔為你收集整理的python随机发牌_魔术师发牌问题 -- python实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 火蚁机器人_适度偷懒提高整体效率:火蚁工
- 下一篇: 53岁“最帅康熙”考公上岸?本人回应:我