給定祕密數字 secret 與猜測數字 guess(等長、僅含數字),回傳提示 xAyB:
範例:secret="1807", guess="7810" → "1A3B" (Bull: 8; Cows: 0,1,7)。
secret="1123", guess="0111" → "1A1B" (第 1 個 1 是 Bull,第 2/3 個 1 中有一個是 Cow)。
secret 中各數字出現次數至 Map<Character, Integer>;同時比對同位置字元,若相同 → bull++,並將該數字計數 -1(避免被後續 Cows 重複計算),標記該位置已匹配。guess,跳過已標記為 Bull 的位置;若該字元在 Map 中計數 > 0 → cow++,計數 -1。bull + "A" + cow + "B"。public class BullsAndCows {
public static String getHint(String secret, String guess) {
int[] cnt = new int[10]; // 數字 0-9,陣列比 HashMap 更快
int bull = 0, cow = 0;
int n = secret.length();
boolean[] matched = new boolean[n];
// 統計 secret 各數字頻次
for (char c : secret.toCharArray()) cnt[c - '0']++;
// 第一遍:找 Bulls,並扣減計數
for (int i = 0; i < n; i++) {
if (secret.charAt(i) == guess.charAt(i)) {
bull++;
cnt[guess.charAt(i) - '0']--; // 扣除已匹配位
matched[i] = true;
}
}
// 第二遍:找 Cows
for (int i = 0; i < n; i++) {
if (!matched[i]) {
int d = guess.charAt(i) - '0';
if (cnt[d] > 0) {
cow++;
cnt[d]--;
}
}
}
return bull + "A" + cow + "B";
}
public static void main(String[] args) {
System.out.println(getHint("1122", "1222")); // 3A0B
System.out.println(getHint("1807", "7810")); // 1A3B
System.out.println(getHint("1123", "0111")); // 1A1B
}
}
HashMap 需注意 getOrDefault、merge 等 API 簡化代碼;陣列效能更優。