All Downloads are FREE. Search and download functionalities are using the official Maven repository.

g0201_0300.s0299_bulls_and_cows.Solution Maven / Gradle / Ivy

There is a newer version: 1.38
Show newest version
package g0201_0300.s0299_bulls_and_cows;

// #Medium #String #Hash_Table #Counting #Level_1_Day_13_Hashmap
// #2022_07_06_Time_6_ms_(86.69%)_Space_42.7_MB_(72.27%)

/**
 * 299 - Bulls and Cows\.
 *
 * Medium
 *
 * You are playing the **[Bulls and Cows](https://en.wikipedia.org/wiki/Bulls_and_Cows)** game with your friend.
 *
 * You write down a secret number and ask your friend to guess what the number is. When your friend makes a guess, you provide a hint with the following info:
 *
 * *   The number of "bulls", which are digits in the guess that are in the correct position.
 * *   The number of "cows", which are digits in the guess that are in your secret number but are located in the wrong position. Specifically, the non-bull digits in the guess that could be rearranged such that they become bulls.
 *
 * Given the secret number `secret` and your friend's guess `guess`, return _the hint for your friend's guess_.
 *
 * The hint should be formatted as `"xAyB"`, where `x` is the number of bulls and `y` is the number of cows. Note that both `secret` and `guess` may contain duplicate digits.
 *
 * **Example 1:**
 *
 * **Input:** secret = "1807", guess = "7810"
 *
 * **Output:** "1A3B"
 *
 * **Explanation:**
 *
 *     Bulls are connected with a '|' and cows are underlined:
 *     "1807"
 *       |
 *     "7810"
 *
 * **Example 2:**
 *
 * **Input:** secret = "1123", guess = "0111"
 *
 * **Output:** "1A1B"
 *
 * **Explanation:**
 *
 *     Bulls are connected with a '|' and cows are underlined:
 *     "1123"       "1123"
 *       |      or    |
 *     "0111"       "0111"
 *     Note that only one of the two unmatched 1s is counted as a cow since the non-bull digits can only be rearranged to allow one 1 to be a bull. 
 *
 * **Example 3:**
 *
 * **Input:** secret = "1", guess = "0"
 *
 * **Output:** "0A0B" 
 *
 * **Example 4:**
 *
 * **Input:** secret = "1", guess = "1"
 *
 * **Output:** "1A0B" 
 *
 * **Constraints:**
 *
 * *   `1 <= secret.length, guess.length <= 1000`
 * *   `secret.length == guess.length`
 * *   `secret` and `guess` consist of digits only.
**/
public class Solution {
    public String getHint(String secret, String guess) {
        final int[] ans = new int[10];
        int bulls = 0;
        int cows = 0;
        for (int i = 0; i < secret.length(); i++) {
            final int s = Character.getNumericValue(secret.charAt(i));
            final int g = Character.getNumericValue(guess.charAt(i));
            if (s == g) {
                bulls++;
            } else {
                // digit s was already seen in guess, is being seen again in secret
                if (ans[s] < 0) {
                    cows++;
                }
                // digit was already seen in secret, now being seen again in guess
                if (ans[g] > 0) {
                    cows++;
                }
                ans[s]++;
                ans[g]--;
            }
        }
        return bulls + "A" + cows + "B";
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy