題目敘述
撲克牌有4種花色,分別是黑桃、紅心、方塊跟梅花
其中每一中花色都有一個數字,範圍從1~13,總共13*4 = 52張牌
1) 請從52張牌中挑選13張牌,輸出第一列所示,牌跟牌之間用tab隔開。
2) 請將抽出的13張牌依數字由大至小排序,同樣數字下比花色,花色大小為
黑桃>紅心>方塊>梅花。
注意! 排序時不能使用內建的sort()
解題思路: 以python撰寫為例
- 將花色以list存放,黑桃(0)、紅心(1)、方塊(2)、梅花(3)各自有對應的index。
- 抽出來的牌以tuple表示,用dictionary存放這13張牌,想法上以hash map 為出發點。
例如抽出來的第2張牌是紅心8 -> { 2 : (1, 8) }
實作
隨機從數字0~3挑選花色,從1~13挑選數字,將數對存到tuple中作為value,第幾次選取作為key。因此在迴圈執行後,pickedCard裡面存放著這13次抽出來的牌,用迴圈依次輸出。
其中pickedCard取出的花色是以數字呈現,作為color的index得到實際的花色字串,在輸出時與轉換過的數字字串做串接,印出結果。
第2個部分要的是排序結果,但我並沒有使用排序,而是讓迴圈從數字13~1、花色從0~3依序檢查是否為被挑出來的牌,如果是就輸出。
簡單來說我使用的是檢查所有請況,從最大到最小,有符合要件就輸出。
感想
先前其實沒對撲克牌的題目做過練習,不過曾經在網路上看過JAVA寫的一些撲克牌程式的處理,因此至少會考慮把花色跟數字分開做處理。看到題目說明不能使用內建排序方法,原本想說自己寫一個function來用就好,不過頂多也就52張牌,於是就採取比較tricky的方式達到題目的要求。
考試當下是筆試不是上機,語法上也沒有那麼確定,不過事後寫出來還是有寫對9成的語法,也同時發現了沒注意到的bug,就是當我挑選的那13張牌有重複時,依序輸出就不會是13張牌,而是少於13張牌,然而實際上也不應該有重複的牌出現,算是沒注意到的大問題。