LeetCode 299 猜數字遊戲 Java實現

貝狄vere發表於2020-09-25

LeetCode299
在這裡插入圖片描述

題目

你在和朋友一起玩 猜數字(Bulls and Cows)遊戲,該遊戲規則如下:

你寫出一個祕密數字,並請朋友猜這個數字是多少。
朋友每猜測一次,你就會給他一個提示,告訴他的猜測數字中有多少位屬於數字和確切位置都猜對了(稱為“Bulls”, 公牛),有多少位屬於數字猜對了但是位置不對(稱為“Cows”, 奶牛)。
朋友根據提示繼續猜,直到猜出祕密數字。
請寫出一個根據祕密數字和朋友的猜測數返回提示的函式,返回字串的格式為 xAyB ,x 和 y 都是數字,A 表示公牛,用 B 表示奶牛。

xA 表示有 x 位數字出現在祕密數字中,且位置都與祕密數字一致。
yB 表示有 y 位數字出現在祕密數字中,但位置與祕密數字不一致。
請注意祕密數字和朋友的猜測數都可能含有重複數字,每位數字只能統計一次。

示例 1:

輸入: secret = “1807”, guess = “7810”
輸出: “1A3B”
解釋: 1 公牛和 3 奶牛。公牛是 8,奶牛是 0, 1 和 7。
示例 2:

輸入: secret = “1123”, guess = “0111”
輸出: “1A1B”
解釋: 朋友猜測數中的第一個 1 是公牛,第二個或第三個 1 可被視為奶牛。

說明: 你可以假設祕密數字和朋友的猜測數都只包含數字,並且它們的長度永遠相等。

程式碼

class Solution {
    public String getHint(String secret, String guess) {
        int A = 0;
        int B = 0;
        Map<Character, Integer> map = new HashMap<>();
        for (int i = 0; i < secret.length(); i++) {
            map.put(secret.charAt(i), map.getOrDefault(secret.charAt(i), 0) + 1);
            //統計某個數出現了多少次
        }
        for (int i = 0; i < guess.length(); i++) {
            //如果位置對應 則A的數量加一 並且使這個數的使用次數減一
            if (secret.charAt(i) == guess.charAt(i)) {
                A++;
                map.replace(guess.charAt(i), map.get(guess.charAt(i)) - 1);
            }
        }
        for (int i = 0; i < guess.length(); i++) {
            //如果位置不對應 且存在這個數 則這個數的使用次數減一
            if (secret.charAt(i) != guess.charAt(i) && map.containsKey(guess.charAt(i))) {
                if (map.get(guess.charAt(i)) != 0) {
                    B++;
                    map.replace(guess.charAt(i), map.get(guess.charAt(i)) - 1);
                }
            }
        }
        return new String(A + "A" + B + "B");
    }
}

相關文章