LeetCode299. 猜数字游戏

先同时遍历两个数组,计算相同位置上相同的字母个数,记为cntA。
在遍历的同时,如果相同位置上两个字母不同,就在一个哈希表unordered_map<char, int>上记录不同的数字(在字符串secret)出现的次数。

然后遍历guess数组,用一个变量cntB记录出现在秘密数字中,但位置不一致的数的个数。
遍历到一个字母,这个字母和secret中对应位置的字母不同且哈希表中该字母出现次数大于0,则cntB++,表示找到了一个出现在秘密数字中,但位置不一致
的数字,然后哈希表中该数字的出现次数减一,表示可用的这个数字少了一个。

最后得到cntA和cntB就是A和B的个数,按照题目的要求返回即可。

代码如下:

class Solution {
public:
    string getHint(string secret, string guess) {
        int size = secret.size();
        unordered_map<char, int> frequency;                  // 记录secret中那些 和guess数组中相同位置的元素不同的元素出现的次数
        int cntA = 0;
        for(int i = 0; i < size; ++i) {
            if(secret[i] == guess[i]) {
                ++cntA;
            } else {                                         // 如果对应位置的数字不同,则记录一下有可能成为B的数字的个数
                ++frequency[secret[i]];
            }
        }
        int cntB = 0;
        for(int i = 0; i < size; ++i) {
            if(secret[i] != guess[i]) {
                if(frequency[guess[i]] > 0) {                // 当前位置数字和secret中的数字不相等,且我们知道secret中其他位置有这个数字,则我们找到了一个B
                    ++cntB;
                    --frequency[guess[i]];                   // 可用数字数量减一
                }
            }
        }
        return to_string(cntA) + "A" + to_string(cntB) + "B";
    }
};
原文地址:https://www.cnblogs.com/linrj/p/13572597.html