力扣:299. 猜数字游戏
难度 中等
题目描述:
你在和朋友一起玩 猜数字(Bulls and Cows)游戏,该游戏规则如下:
写出一个秘密数字,并请朋友猜这个数字是多少。朋友每猜测一次,你就会给他一个包含下述信息的提示:
- 猜测数字中有多少位属于数字和确切位置都猜对了(称为 "Bulls", 公牛),
- 有多少位属于数字猜对了但是位置不对(称为 "Cows", 奶牛)。也就是说,这次猜测中有多少位非公牛数字可以通过重新排列转换成公牛数字。
给你一个秘密数字
secret
和朋友猜测的数字guess
,请你返回对朋友这次猜测的提示。提示的格式为
"xAyB"
,x
是公牛个数,y
是奶牛个数,A
表示公牛,B
表示奶牛。请注意秘密数字和朋友猜测的数字都可能含有重复数字。
示例 1:
输入: secret = "1807", guess = "7810" 输出: "1A3B" 解释: 数字和位置都对(公牛)用 '|' 连接,数字猜对位置不对(奶牛)的采用斜体加粗标识。 "1807" | "7810"
示例 2:
输入: secret = "1123", guess = "0111" 输出: "1A1B" 解释: 数字和位置都对(公牛)用 '|' 连接,数字猜对位置不对(奶牛)的采用斜体加粗标识。 "1123" "1123" | or | "0111" "0111" 注意,两个不匹配的 1 中,只有一个会算作奶牛(数字猜对位置不对)。通过重新排列非公牛数字,其中仅有一个 1 可以成为公牛数字。
示例 3:
输入:secret = "1", guess = "0" 输出:"0A0B"
示例 4:
输入:secret = "1", guess = "1" 输出:"1A0B"
提示:
- \(1\) <=
secret.length
,guess.length
<= \(1000\)secret.length == guess.length
secret
和guess
仅由数字组成来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/bulls-and-cows
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
统计次数有关的题目一般都可以用哈希表完成:
- 统计
secret
中每个字母出现的次数,该过程中还可以顺便统计「位置与数字都相同」的数目。 - 遍历
guess
中的每个数字,统计「在secret
中有匹配数字」的数目。 - 由于 \(2\) 中的结果包括了 \(1\) 中的结果,所以要减去 \(1\) 的结果
- 将结果转为格式化字符串
双百代码实现如下:
class Solution {
public:
string getHint(string secret, string guess) {
int x = 0, y = 0;
int has[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
char str[9];
for (int i = 0; i < secret.size(); ++i) {
if (secret[i] == guess[i]) {
++x;
}
++has[secret[i] - '0'];
}
for (int i = 0; i < guess.size(); ++i) {
if (has[guess[i] - '0']) {
++y;
--has[guess[i] - '0'];
}
}
sprintf(str, "%dA%dB", x, y - x);
return string(str);
}
};