猜数字游戏
题目要求
解体思路
有多少位属于数字和确切位置都猜对了:统计
s
e
c
r
e
t
[
i
]
=
g
u
e
s
s
[
i
]
secret[i]=guess[i]
secret[i]=guess[i]的个数。
有多少位属于数字猜对了但是位置不对:用两个数组(哈希表)分别统计
s
e
c
r
e
t
[
i
]
≠
g
u
e
s
s
[
i
]
secret[i]\ne guess[i]
secret[i]=guess[i]时
s
e
c
r
e
t
[
i
]
secret[i]
secret[i]的出现次数和
g
u
e
s
s
[
i
]
guess[i]
guess[i]的出现次数,记作
c
n
t
S
cntS
cntS和
c
n
t
G
cntG
cntG。答案为
∑
m
i
n
(
c
n
t
S
[
i
]
,
c
n
t
G
[
i
]
)
∑min(cntS[i],cntG[i])
∑min(cntS[i],cntG[i])
例如
s
e
c
r
e
t
=
12223
g
u
e
s
s
=
13332
secret=12223\\ guess=13332
secret=12223guess=13332
对于
secret
[
i
]
≠
guess
[
i
]
\textit{secret}[i] \ne \textit{guess}[i]
secret[i]=guess[i]的情况,‘2’ 有1个猜对但是位置不对,‘3’我们猜了3个但是
s
e
c
r
e
t
secret
secret只有1个,所以‘3’也猜对了1个但是位置不对。所以一共有2位属于数字猜对了但是位置不对。
class Solution:
def getHint(self, secret: str, guess: str) -> str:
a = 0
cnt_s = Counter()
cnt_g = Counter()
for x,y in zip(secret,guess):
if x == y:
a +=1
else:
cnt_s[x] +=1
cnt_g[y] +=1
b = (cnt_s & cnt_g).total()
return f"{a}A{b}B"
复杂度分析
时间复杂度:
O
(
n
O(n
O(n,其中n为
s
e
c
r
e
t
secret
secret的长度。
空间复杂度:
O
(
∣
Σ
∣
)
\mathcal{O}(|\Sigma|)
O(∣Σ∣)。其中
∣
Σ
∣
|\Sigma|
∣Σ∣为字符集合的大小,本题字符均为数字,所以
∣
Σ
∣
=
10
|\Sigma|=10
∣Σ∣=10。
参考
灵茶山艾府