299. 猜數字游戲


你在和朋友一起玩 猜數字(Bulls and Cows)游戲,該游戲規則如下:

寫出一個秘密數字,並請朋友猜這個數字是多少。朋友每猜測一次,你就會給他一個包含下述信息的提示:

猜測數字中有多少位屬於數字和確切位置都猜對了(稱為 "Bulls", 公牛),
有多少位屬於數字猜對了但是位置不對(稱為 "Cows", 奶牛)。也就是說,這次猜測中有多少位非公牛數字可以通過重新排列轉換成公牛數字。
給你一個秘密數字 secret 和朋友猜測的數字 guess ,請你返回對朋友這次猜測的提示。

提示的格式為 "xAyB" ,x 是公牛個數, y 是奶牛個數,A 表示公牛,B 表示奶牛。

請注意秘密數字和朋友猜測的數字都可能含有重復數字。

 

示例 1:

輸入: secret = "1807", guess = "7810"
輸出: "1A3B"
解釋: 數字和位置都對(公牛)用 '|' 連接,數字猜對位置不對(奶牛)的采用斜體加粗標識。
"1807"
|
"7810"
示例 2:

輸入: secret = "1123", guess = "0111"
輸出: "1A1B"
解釋: 數字和位置都對(公牛)用 '|' 連接,數字猜對位置不對(奶牛)的采用斜體加粗標識。
"1123" "1123"
| or |
"0111" "0111"
注意,兩個不匹配的 1 中,只有一個會算作奶牛(數字猜對位置不對)。通過重新排列非公牛數字,其中僅有一個 1 可以成為公牛數字。
示例 3:

輸入:secret = "1", guess = "0"
輸出:"0A0B"
示例 4:

輸入:secret = "1", guess = "1"
輸出:"1A0B"
 

提示:

1 <= secret.length, guess.length <= 1000
secret.length == guess.length
secret 和 guess 僅由數字組成

思路1:

  字典+拉鏈法

  將數字和和出現的位置記錄在字典中,在遍歷guess計算A和B的值

  

 1 class Solution:
 2     def getHint(self, secret: str, guess: str) -> str:
 3         maps = {}
 4         length = len(secret)
 5         bull_mask = [False] * length
 6         A = 0
 7         B = 0
 8         for i in range(length):
 9             key = secret[i]
10             if key in maps:
11                 maps[key].append(i)
12             else:
13                 maps[key] = [i]
14 
15         # bulls
16         for i in range(length):
17             guess_ch = guess[i]
18             if guess_ch in maps and i in maps[guess_ch]:
19                 A += 1
20                 maps[guess_ch].remove(i)
21                 bull_mask[i] = True
22 
23         # cows
24         for i in range(length):
25             guess_ch = guess[i]
26             if not bull_mask[i] and guess_ch in maps and maps[guess_ch]:
27                 B += 1
28                 maps[guess_ch].pop()
29         return format(f"{A}A{B}B")

思路2: 

  考慮到數字一共只有10種出現情況,可以將字典簡化為數組

  某數字對應奶牛的數量是  排除公牛后,min(guess該數字出現次數,secret中該數字出現次數)

  

 1 class Solution2:
 2     def getHint(self, secret: str, guess: str) -> str:
 3         A = 0
 4         B = 0
 5         cnt_secret = [0] * 10
 6         cnt_guess = [0] * 10
 7 
 8         for i in range(len(secret)):
 9             guess_ch = guess[i]
10             secret_ch = secret[i]
11             # bulls
12             if guess_ch == secret_ch:
13                 A += 1
14             # cows
15             else:
16                 cnt_secret[ord(secret_ch) - ord('0')] += 1
17                 cnt_guess[ord(guess_ch) - ord('0')] += 1
18         for s, g in zip(cnt_secret, cnt_guess):
19             B += min(s, g)
20         return f"{A}A{B}B"

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM