/** * You are playing the following Bulls and Cows game with your friend: You write down a number and ask your friend to * guess what the number is. Each time your friend makes a guess, you provide a hint that indicates how many digits in * said guess match your secret number exactly in both digit and position (called "bulls") and how many digits match * the secret number but locate in the wrong position (called "cows"). Your friend will use successive guesses and * hints to eventually derive the secret number. * <p> * For example: * <p> * Secret number: "1807" * Friend's guess: "7810" * Hint: 1 bull and 3 cows. (The bull is 8, the cows are 0, 1 and 7.) * Write a function to return a hint according to the secret number and friend's guess, use A to indicate the bulls and * B to indicate the cows. In the above example, your function should return "1A3B". * <p> * Please note that both secret number and friend's guess may contain duplicate digits, for example: * <p> * Secret number: "1123" * Friend's guess: "0111" * In this case, the 1st 1 in friend's guess is a bull, the 2nd or 3rd 1 is a cow, and your function should return * "1A1B". * You may assume that the secret number and your friend's guess only contain digits, and their lengths are always * equal. * <p> * Tags: Hash Table */ public class BullsAndCows { /** * Use an array of 10 digits as a simple table. * We can get # of bulls by comparing digits one by one. * If they are the same, # of bulls increase by 1. * Otherwise, we update the array by increasing count of digit in secret, * decreasing count of digit in guess. * We check count before update to get # of cows. */ public String getHint(String secret, String guess) { int bulls = 0; int cows = 0; int[] count = new int[10]; for (int i = 0; i < secret.length(); i++) { if (secret.charAt(i) == guess.charAt(i)) bulls++; else { /* * If count is less than zero before we increase it, it means that it was decreased by guess already. */ if (count[secret.charAt(i) - '0']++ < 0) cows++; if (count[guess.charAt(i) - '0']-- > 0) cows++; } } return bulls + "A" + cows + "B"; } }