魔術(shù)師發(fā)牌問題 -- python實現(xiàn)

問題描述

魔術(shù)師手中有A、2、3……J、Q、K十三張黑桃撲克牌。在表演魔術(shù)前,魔術(shù)師已經(jīng)將他們按照一定的順序疊放好(有花色的一面朝下).魔術(shù)表演過程為:一開始,魔術(shù)師數(shù)1,然后把最上面的那張牌翻過來,是黑桃A;然后將其放到桌面上;第二次,魔術(shù)師數(shù)1、2;將第一張牌放到這些牌的最下面,將第二張牌翻轉(zhuǎn)過來,正好是黑桃2;第三次,魔術(shù)師數(shù)1、2、3;將第1、2張牌依次放到這些牌的最下面,將第三張牌翻過來正好是黑桃3;……直到將所有的牌都翻出來為止.問原來牌的順序是如何的.

正確結(jié)果: [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)                     # 紙牌總數(shù)
    index = -1

    for num in range(1, 14):
        i = 0                               # 計數(shù)
        while i < num:
            index = (index + 1) % count     # 索引向前一步(可循環(huán))
            if pokers[index] == 0:          # 當(dāng)前元素為0時才計數(shù), 不為0則跳過
                i += 1
        pokers[index] = num

    print('#' * 50)
    print(f'\n牌組: {pokers}\n')
    print('#' * 50)
2. 單循環(huán)鏈表
class Node:
    """節(jié)點"""

    def __init__(self, value):
        self.data = value
        self.next = None

    def __repr__(self):
        return f'Node: {self.data}'


class CircularLinkedList:
    """單循環(huán)鏈表"""
    def __init__(self):
        self.rear = None    # 尾節(jié)點

    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):
        """
        按順序打印全部節(jié)點
        """
        if self.is_empty():
            return
        p = self.rear.next      # 取得頭部節(jié)點
        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)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容