猜數字遊戲:密碼 secret、猜測 guess(等長數字字串)。提示格式 xAyB:
範例:secret="1807", guess="7810" → 1A3B(公牛:8;奶牛:0,1,7)。secret="1123", guess="0111" → 1A1B(第一個 1 為公牛,第二/三個 1 之一為奶牛)。
因為只包含數字 0-9,用大小 10 的陣列統計非公牛位置的數字頻次。
aCnt,並對非公牛位置的 secret[i]、guess[i] 分別在 sCnt[10]、gCnt[10] 計數。d=0..9,奶牛數累加 min(sCnt[d], gCnt[d])(雙方非公牛位置共同擁有的數字數量)。class Solution {
public:
string getHint(string secret, string guess) {
int aCnt = 0, bCnt = 0;
vector<int> sCnt(10, 0), gCnt(10, 0);
if (secret.length() != guess.length() || secret.empty()) return "0A0B";
for (int i = 0; i < secret.length(); ++i) {
char c1 = secret[i], c2 = guess[i];
if (c1 == c2) {
++aCnt;
} else {
++sCnt[c1 - '0'];
++gCnt[c2 - '0'];
}
}
for (int i = 0; i < 10; ++i) {
bCnt += min(sCnt[i], gCnt[i]);
}
return to_string(aCnt) + "A" + to_string(bCnt) + "B";
}
};
O(1)。O(n)。O(n),n 為字串長度。O(1)(兩個大小 10 陣列)。