Leetcode刷题日记-程序员面试经典(2020.7.15):珠玑妙算

题目描述如下:

 

 

 分析如下:

a.建立两个字典,存放solution和guess颜色出现的个数
b.因为题目中说“猜中”不能算入“伪猜中”,因此“猜中”的优先级更高
c.先计算猜中的次数,对应的字典-1
d.再计算伪猜中的次数,对应的字典-1
e.最后返回结果即可

代码如下:

 1 #!/usr/bin/env python
 2 # -*- coding: utf-8 -*-
 3 """
 4 # @Time : 2020/7/15 9:14 
 5 
 6 # @Author : ZFJ
 7 
 8 # @File : 珠玑妙算.py 
 9 
10 # @Software: PyCharm
11 """
12 
13 from collections import Counter
14 
15 
16 class Solution(object):
17     def masterMind(self, solution, guess):
18         """
19         对于这种涉及到次数的问题,我的通用解法均是使用字典计数
20         首先我们建立两个字典进行计数
21         接着先计算猜中的,在计算伪猜中的,然后将对应位置的计数减一即可
22         :type solution: str
23         :type guess: str
24         :rtype: List[int]
25         """
26         # 使用字典记录下每个字符串中字幕出现的次数
27         dict_solution = Counter(solution)
28         dict_guess = Counter(guess)
29         # 答案列表
30         result = [0, 0]
31         # 找到真的猜中的次数
32         for i in range(len(solution)):
33             # 对应位置的值相等
34             if solution[i] == guess[i]:
35                 # 结果中的真猜中次数加1
36                 result[0] += 1
37                 # 对应的字典计数减一
38                 dict_solution[solution[i]] -= 1
39                 dict_guess[guess[i]] -= 1
40         # 找到伪猜中次数
41         for j in range(len(solution)):
42             # 根据条件,判断条件是猜测的字母在原来的字符串中,并且二者的计数均不能为0
43             if guess[j] in solution and dict_solution[guess[j]] > 0 and dict_guess[guess[j]] > 0:
44                 result[1] += 1
45                 dict_solution[guess[j]] -= 1
46                 dict_guess[guess[j]] -= 1
47 
48         return result
49 
50 
51 if __name__ == "__main__":
52     test = Solution().masterMind(solution="RGRB", guess="BBBY")
53     print(f"猜中 {test[0]}次,伪猜中{test[1]}次。")

运行消耗如下:

 

posted @ 2020-07-15 10:02  风骚的小柴犬  阅读(222)  评论(0编辑  收藏  举报