LeetCode刷题日记-数组-面试题 16.15. 珠玑妙算

题目描述

题目链接: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]

鸣谢:
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值