1. 程式人生 > 實用技巧 >LeetCode299. 猜數字遊戲

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";
    }
};