leetcode中公牛和奶牛算法的解释

时间:2016-11-29 06:50:59

标签: java algorithm

算法在这里:https://discuss.leetcode.com/topic/28463/one-pass-java-solution

public static String getHint(String secret, String guess) {
        int bulls = 0;
        int cows = 0;
        int[] numbers = new int[10];
        for (int i = 0; i<secret.length(); i++) {
            int s = Character.getNumericValue(secret.charAt(i));
            int g = Character.getNumericValue(guess.charAt(i));
            if (s == g) bulls++;
            else {
                if (numbers[s] < 0){
                    cows++;
                }
                if (numbers[g] > 0){
                    cows++;
                }
                numbers[s] ++;
                numbers[g] --;
            }
        }
        return bulls + "A" + cows + "B";
    }

但如何理解这一部分:

numbers[s] ++;
numbers[g] --;

为什么使用负数来计算猜测中出现的次数和正数来计算秘密值。

1 个答案:

答案 0 :(得分:1)

numbers数组会跟踪两个数组中看到的 不匹配的 数字。最初,numbers数组中的每个条目都为0,表示在任一数组中都没有看到该数字。正条目表示secret数组中的数字比guess数组中的数字多。否定条目表示guess数组中的数字多于secret数组中的数字。

因此,当算法在secret数组中看到一个数字时,它会增加numbers数组中的相应条目。如果该条目在增量之前恰好为负数,则表示该数字已在guess数组中看到,因此cows计数会增加。

同样,当算法在guess数组中看到一个数字时,它会减少numbers数组中的相应条目。如果在递减之前该条目恰好是正数,则意味着该数字已在secret数组中看到,因此cows计数增加。