[leetcode]Python实现-299. 猜数字游戏

299. 猜数字游戏

描述

你正在和你的朋友玩 猜数字(Bulls and Cows)游戏:你写下一个数字让你的朋友猜。每次他猜测后,你给他一个提示,告诉他有多少位数字和确切位置都猜对了(称为“Bulls”, 公牛),有多少位数字猜对了但是位置不对(称为“Cows”, 奶牛)。你的朋友将会根据提示继续猜,直到猜出秘密数字。
请写出一个根据秘密数字和朋友的猜测数返回提示的函数,用 A 表示公牛,用 B 表示奶牛。
请注意秘密数字和朋友的猜测数都可能含有重复数字。

示例1

输入: secret = “1807”, guess = “7810”
输出: “1A3B”
解释: 1 公牛和 3 奶牛。公牛是 8,奶牛是 0, 1 和 7。

示例2

输入: secret = “1123”, guess = “0111”
输出: “1A1B”
解释: 朋友猜测数中的第一个 1 是公牛,第二个或第三个 1 可被视为奶牛。

思路:
首先需要认真理解一下题目的意思。
题目中有三种结果:
1)数字正确且位置正确 - 公牛Bull 输出结果用A表示。
2)数字正确但位置不对 - 奶牛Cow 输出结果用B表示。
3)字符串为空。

最后要求输出的是A和B的数量,那么问题就转换为如何统计A和B的数量。大致流程是先对secret进行遍历,将字符及其数量存储到字典d中,然后再遍历guess进行数量的统计。

对于A数字正确位置正确很好理解,直接判断secret[i] 是否等于 guess[i]即可,直接累加可得到A的数量。但是需要注意的是B的情况,由于只对数字做了限制,对位置没有限制,因此在进行遍历时不能直接做累加操作,应考虑前后字符重复的问题(例如输入“1122”,”1222“),待全部遍历完再进行数量统计,因此引入cow字典用于记录中间产生的数据。

需要注意的是数字正确,需满足两个条件:有共同字符A,且guess中A字符的数量小于等于secret。

class Solution:
    def getHint(self, secret: str, guess: str) -> str:
        if not secret:
            print('null')
        d = {}
        for i in secret:
            if i in d.keys():
                d[i] += 1
            else:
                d[i] = 1
        cow = bull = temp_cow = 0
        temp_cow_dict = {}
        for num in range(len(guess)):
            item = guess[num]
            if item in d.keys():
                if d[item] > 0:
                    if secret[num] == guess[num]:
                        bull += 1
                        d[item] -= 1
                    else:
                        if item in temp_cow_dict.keys():
                            temp_cow_dict[item] += 1
                        else:
                            temp_cow_dict[item] = 1
        for k in temp_cow_dict.keys():
            if d[k] > 0:
                cow += min(temp_cow_dict[k], d[k])
        return '%dA%dB'%(bull, cow)

[leetcode]Python实现-299. 猜数字游戏_第1张图片
if判断太多,稍后进行优化改进。

你可能感兴趣的:(leetcode,Python)