就是计数就可以了,位置相同数字相同就公牛+1,数字相同但位置不同就母牛+1
class Solution {
public:
string getHint(string secret, string guess) {
int num1 = 0, num2 = 0;
unordered_map<int, int> m;
for(int i = 0; i < secret.size(); ++i){
if(secret[i] == guess[i]){
++num1;
secret[i] = 'x';//记录这个位置已经计算过了
}
else ++m[guess[i]];
}
for(auto c : secret){
if(isdigit(c) && m.count(c)){
if(m[c] > 0) ++num2;
--m[c];
}
}
string res = to_string(num1) + 'A' + to_string(num2) + 'B';
return res;
}
};
优化一下:
class Solution {
public:
string getHint(string secret, string guess) {
int num1 = 0, num2 = 0;
unordered_map<int, int> m;
for(int i = 0; i < secret.size(); ++i){
if(secret[i] == guess[i]) ++num1;
++m[secret[i]];
}
for(auto c : guess){
if(m[c] > 0){
++num2;
--m[c];
}
}
return to_string(num1) + 'A' + to_string(num2-num1) + 'B';//除去位置相同字符相同的个数
}
};
一次循环:
class Solution {
public:
string getHint(string secret, string guess) {
int num1 = 0, num2 = 0;
vector<int> m(10, 0);
for(int i = 0; i < secret.size(); ++i){
if(secret[i] == guess[i]) ++num1;
else{//其实就死一个数组当两个用
if(m[secret[i]-'0'] < 0)//secret中该字符出现,就将对应位置+1
++num2;
++m[secret[i]-'0'];
if(m[guess[i]-'0'] > 0)//guess中该字符出现,就将对应位置-1
++num2;
--m[guess[i]-'0'];
}
}
return to_string(num1) + 'A' + to_string(num2) + 'B';//除去位置相同字符相同的个数
}
};