LeetCode299. 猜數字遊戲
阿新 • • 發佈:2020-08-27
先同時遍歷兩個陣列,計算相同位置上相同的字母個數,記為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"; } };