算法在这里: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] --;
为什么使用负数来计算猜测中出现的次数和正数来计算秘密值。
答案 0 :(得分:1)
numbers
数组会跟踪两个数组中看到的 不匹配的 数字。最初,numbers
数组中的每个条目都为0,表示在任一数组中都没有看到该数字。正条目表示secret
数组中的数字比guess
数组中的数字多。否定条目表示guess
数组中的数字多于secret
数组中的数字。
因此,当算法在secret
数组中看到一个数字时,它会增加numbers
数组中的相应条目。如果该条目在增量之前恰好为负数,则表示该数字已在guess
数组中看到,因此cows
计数会增加。
同样,当算法在guess
数组中看到一个数字时,它会减少numbers
数组中的相应条目。如果在递减之前该条目恰好是正数,则意味着该数字已在secret
数组中看到,因此cows
计数增加。