猜数字游戏
题面
leetcode题目
你在和朋友一起玩 猜数字(Bulls and Cows)游戏,该游戏规则如下:
写出一个秘密数字,并请朋友猜这个数字是多少。朋友每猜测一次,你就会给他一个包含下述信息的提示:
猜测数字中有多少位属于数字和确切位置都猜对了(称为 "Bulls", 公牛), 有多少位属于数字猜对了但是位置不对(称为 "Cows", 奶牛)。也就是说,这次猜测中有多少位非公牛数字可以通过重新排列转换成公牛数字。 给你一个秘密数字 secret 和朋友猜测的数字 guess ,请你返回对朋友这次猜测的提示。
提示的格式为 "xAyB" ,\(x\) 是公牛个数, \(y\) 是奶牛个数,A 表示公牛,B 表示奶牛。
请注意秘密数字和朋友猜测的数字都可能含有重复数字。
example
输入: secret = "1807", guess = "7810"
输出: "1A3B"
解释: 数字和位置都对(公牛)用 '|' 连接,数字猜对位置不对(奶牛)的采用斜体加粗标识。
数据范围
- \(1 \leq secret.length, guess.length \leq 1000\)
- \(secret.length == guess.length\)
- \(secret\) 和 \(guess\) 仅由数字组成
题解
总体思路
没啥好说的,这个题都想不到思路就太不应该了。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| #include <iostream> #include <vector> #include <cstring> #include <map> #include <cmath> #include <map> using namespace std; #define _DEBUG
class Solution { public: string getHint(string secret, string guess) { int cntA = 0; int cntB = 0; map<char, int> mapA; map<char, int> mapB; for (int i = 0; i < secret.length(); i++) { if (secret[i] == guess[i]) { cntA++; } else { mapA[secret[i]]++; mapB[guess[i]]++; } } for (auto iter = mapB.begin(); iter != mapB.end(); iter++) { char key = iter->first; int count = iter->second; if (mapA[key] > count) { cntB += count; } else { cntB += mapA[key]; } } string ret = to_string(cntA) + "A" + to_string(cntB) + "B"; return ret; } };
int main() { Solution s; string secret = "1807"; string guess = "7810"; cout << s.getHint(secret, guess) << endl;
return 0; }
|