题目描述
(Source: LeetCode 力扣)
解题思路
自己解
- 二层扫描,第一次扫描位置 (A) 的数量,第二次扫描 B 的数量
- 空间:使用
candidate_list
&scan_list
去保存要扫描 B 的数量
别人的解法
- O(N)
*先扫描一次,把不是位置匹配的(A)存进字典,利用加减的方式去计算不匹配数字
*真实数字出现在秘密里,在字典计数+1 - 真实数字出现在猜测里,在字典计数-1
- 这样一增一减消消弭先后顺序的问题(**口述的好处),即为不匹配的个数
- B 的数量 = total - A - 不匹配个数
Python 代碼
# 自己的解法
class Solution:
def getHint(self, secret: str, guess: str) -> str:
a =0
b =0
scan_list = []
candidate_list = []
for i in range(len(secret)):
if secret[i] == guess[i]:
a+=1
else:
scan_list.append(secret[i])
candidate_list.append(guess[i])
for i in range(len(candidate_list)):
if candidate_list[i] in scan_list:
b+=1
scan_list.remove(candidate_list[i])
return str(a)+'A'+str(b)+'B'
# 別人的解法
class Solution:
def getHint(self, secret: str, guess: str) -> str:
s_dict={}
a=0
for i in range(len(secret)):
if secret[i] == guess[i]:
a+=1
else:
s_dict[secret[i]] = s_dict.get(secret[i],0) +1
s_dict[guess[i]] = s_dict.get(guess[i],0) -1
# 不匹配的数量
b = len(secret) - a - sum(filter(lambda x: x>0, s_dict.values()))
return str(a)+'A'+str(b)+'B'