猜数游戏(公牛母牛)Bulls and Cows

问题:

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.

For example:

Secret number:  "1807"
Friend's guess: "7810"

Hint: 1 bull and 3 cows. (The bull is 8, the cows are 01 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".

Please note that both secret number and friend's guess may contain duplicate digits, for example:

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.

解决:

【题意】给定两串数字,其中的一串数字可以看作为密码,另一串可看作为待猜测的数字,将猜对了的数字(位置和数字都相同)个数记为:个数+A,将位置不对而包含在密码中的数字个数记为:个数+B。

① 使用hash table记录字符串中的数字及其出现的次数,然后进行匹配。

class Solution { //2ms
    public String getHint(String secret, String guess) {
        int[] hash= new int[10];
        int bulls = 0;
        int cows = 0;
        for (int i = 0;i <secret.length();i ++){
            int s = secret.charAt(i) - '0';
            int g = guess.charAt(i) - '0';
            if (s == g){
                bulls ++;
            }else{
                if(hash[s] < 0){//guess里有多余的,小于0只可能是guess造成的
                    cows ++;
                }
                if (hash[g] > 0){//secret里有多余的,大于0只可能是secret造成的
                    cows ++;
                }
                hash[s] ++;
                hash[g] --;
            }
        }
        return bulls + "A" + cows + "B"; 
    }
}

转载于:https://my.oschina.net/liyurong/blog/1592167