leetcode-299-猜数字游戏

猜数字游戏

题面

leetcode题目

你在和朋友一起玩 猜数字(Bulls and Cows)游戏,该游戏规则如下:

写出一个秘密数字,并请朋友猜这个数字是多少。朋友每猜测一次,你就会给他一个包含下述信息的提示:

猜测数字中有多少位属于数字和确切位置都猜对了(称为 "Bulls", 公牛), 有多少位属于数字猜对了但是位置不对(称为 "Cows", 奶牛)。也就是说,这次猜测中有多少位非公牛数字可以通过重新排列转换成公牛数字。 给你一个秘密数字 secret 和朋友猜测的数字 guess ,请你返回对朋友这次猜测的提示。

提示的格式为 "xAyB" ,\(x\) 是公牛个数, \(y\) 是奶牛个数,A 表示公牛,B 表示奶牛。

请注意秘密数字和朋友猜测的数字都可能含有重复数字。

example

输入: secret = "1807", guess = "7810"
输出: "1A3B"
解释: 数字和位置都对(公牛)用 '|' 连接,数字猜对位置不对(奶牛)的采用斜体加粗标识。

1
2
3
"1807"
|
"7810"

数据范围

  • \(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;
}
};

// for test
int main()
{
Solution s;
string secret = "1807";
string guess = "7810";
cout << s.getHint(secret, guess) << endl;

return 0;
}

作者

Yu Leng

发布于

2021-11-08

更新于

2024-10-28

许可协议

评论