第一次代码
#include <iostream>
using namespace std;
#include <string>
#include <unordered_map>
#include <algorithm>
int main()
{
string secret = "1122";
string guess = "0001";
int n = secret.size();
int count1 = 0;
vector<pair<int, char>> arr;
vector<pair<int, char>> arr2;
for (int i = 0; i < n; ++i) {
if (secret[i] == guess[i]) {
arr.emplace_back(make_pair(i, 'x'));
arr2.emplace_back(make_pair(i,'x'));
count1++;
}
else {
arr.emplace_back(make_pair(i, secret[i]));
arr2.emplace_back(make_pair(i, guess[i]));
}
}
for (int i = 0; i < n; ++i) {
cout << "元素:" << arr[i].first << " " << arr[i].second << " ";
cout << endl;
}
for (int i = 0; i < n; ++i) {
cout << "元素:" << arr[i].first << " " << arr2[i].second << " ";
cout << endl;
}
int count2 = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (arr2[i].second != 'x' && arr[j].second == arr2[i].second) {
count2++;
arr[j].second = 'x';
break;
//arr.emplace_back(make_pair(0, 'x'));
}
}
}
for (int i = 0; i < n; ++i) {
cout << "元素:" << arr[i].first << " " << arr[i].second << " ";
cout << endl;
}
cout << count1 << endl;
cout << count2 << endl;
system("pause");
return 0;
}
第二次代码
#include <iostream>
using namespace std;
#include <string>
#include <unordered_map>
#include <algorithm>
int main()
{
string secret = "1807";
string guess = "7810";
int n = secret.size();
int count1 = 0;
for (int i = 0; i < n; ++i) {
if (secret[i] == guess[i]) {
secret[i] = 'x';
guess[i] = 'x';
count1++;
}
}
cout <<"secret元素为:" << secret << endl;
cout <<"guess元素为:" << guess << endl;
int count2 = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (guess[i] != 'x' && secret[j] == guess[i]) {
count2++;
secret[j] = 'x';
break;
//arr.emplace_back(make_pair(0, 'x'));
}
}
}
cout << count1 << endl;
cout << count2 << endl;
system("pause");
return 0;
}
第三次代码
根据题意,对于公牛,需要满足数字和确切位置都猜对。我们可以遍历 \textit{secret}secret 和 \textit{guess}guess,统计满足 \textit{secret}[i]=\textit{guess}[i]secret[i]=guess[i] 的下标个数,即为公牛的个数。
对于奶牛,需要满足数字猜对但是位置不对。我们可以在 \textit{secret}[i]\ne\textit{guess}[i]secret[i]
=guess[i] 时,分别统计 \textit{secret}secret 和 \textit{guess}guess 的各个字符的出现次数,记在两个长度为 1010 的数组中。根据题目所述的「这次猜测中有多少位非公牛数字可以通过重新排列转换成公牛数字」,由于多余的数字无法匹配,对于 \texttt{0}0 到 \texttt{9}9 的每位数字,应取其在 \textit{secret}secret 和 \textit{guess}guess 中的出现次数的最小值。将每位数字出现次数的最小值累加,即为奶牛的个数。
class Solution {
public:
string getHint(string secret, string guess) {
int bulls = 0;
vector<int> cntS(10), cntG(10);
for (int i = 0; i < secret.length(); ++i) {
if (secret[i] == guess[i]) {
++bulls;
} else {
++cntS[secret[i] - '0'];
++cntG[guess[i] - '0'];
}
}
int cows = 0;
for (int i = 0; i < 10; ++i) {
cows += min(cntS[i], cntG[i]);
}
return to_string(bulls) + "A" + to_string(cows) + "B";
}
};