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: