题目描述
题目链接:https://leetcode-cn.com/problems/master-mind-lcci/
解题思路
关键:全部可能的命中次数 - 正确命中次数 = 伪命中次数
**全部可能的命中次数 :**若某个字母在两者中都出现过,那么取两者中该字母的频数的较小值,即为该字母可能的命中次数,最后求和得总的可能命中次数。或者说“完美的”,“理想的”命中次数。
**正确命中次数:**某字母在两者中都出现过,并且位置相同,则该字母的命中次数。求和得所有命中个数
AC代码,看注释:
熟练掌握Counter
用法会变得更高效!
from collections import Counter
class Solution:
def masterMind(self, solution: str, guess: str) -> List[int]:
# 全部可能的命中次数 - 正确命中次数 = 伪命中次数.
# 猜中数量
a = sum( x==y for (x,y) in zip(solution, guess))
# 全部可能的命中次数 Counter返回一个字典
#solution="RGBY"
#guess = "GGRR"
# Counter ---统计每个字母频数
# Counter(solution) = Counter({'R': 1, 'G': 1, 'B': 1, 'Y': 1})
# Counter(guess) = Counter({'G': 2, 'R': 2})
# &运算 相当于取在两者中都出现过的字母,并且取其中较小的那个频数)
#Counter({'R': 1, 'G': 1}),表示"R"和“G”可能可以分别完美命中1次
# values 取出字典中的value dict_values([1, 1])
# sum求和即代表总的完美命中个数
b = sum((Counter(solution) & Counter(guess)).values())
return [a, b-a]
鸣谢: