参考代码:
class Solution {
public String getHint(String secret, String guess) {
int[] nums = new int[10];
int m=0,n=0;
for(int i=0;i<guess.length();i++){
if(secret.charAt(i)==guess.charAt(i)){
m++;
}
else{
if(nums[guess.charAt(i)-'0'] > 0) n++;
nums[guess.charAt(i)-'0']--;
if(nums[secret.charAt(i)-'0'] < 0) n++;
nums[secret.charAt(i)-'0']++;
}
}
String s=m+"A"+n+"B";
return s;
}
}
大致思路:先确定公牛的数量,即二者在相同的位置的数也相等,这个很好统计,主要是奶牛的数量,公牛的else就是不在相同的位置,满足奶牛的一个条件,另一个条件就是找到相等的数,可以这样思考
创建一个0-9有10个数的数组,其初始值都为0,先让guess第i个数字对应的数组中的那个下标数减一,即表明在guess中出现就减一,在secret中出现就加一,同时能进入if语句说明在secret中出现过或者在guess中出现过,并且在不同的位置,这时就应该n++,统计奶牛的数目。这里有点难懂,需要多思考思考。
例:
secret = "1123", guess = "0111"
首先guess中的0与secret中的1不同,进入else语句,nums[0]=0(guess.charAt(i)-'0'就是guess中的第一个数0)
不满足条件,继续到nums[guess.charAt(i)-'0']--;此时nums[0]=-1
继续向下,secret第一个数是1,所以nums[1]=0,不满足条件,继续到nums[secret.charAt(i)-'0']++;此时nums[1]=1;
继续向下,到各自的第二个数,guess中为1,secret中为1,满足公牛的条件,m++,m=1,继续向下到第三个数,guess中为1,secret中为2,进入else语句中
nums[1]=1>0进入if语句,n++,n=1,继续向下,此时nums[1]=0;
继续向下,nums[2]=0,无法进入if语句,继续向下,nums[2]=1
到第四个数,guess中为1,secret中为3,进入else语句
nums[1]=0,继续向下,nums[1]=-1
nums[3]=0,继续向下,nums[3]=1
结束循环,1A1B
具体实现:
首先创建一个数组,在for循环中统计公牛与奶牛的数量
if(secret.charAt(i)==guess.charAt(i)){
m++;
}
这个是统计公牛的数量,在相同位置有相同的数
if(nums[guess.charAt(i)-'0'] > 0) n++;
nums[guess.charAt(i)-'0']--;
if(nums[secret.charAt(i)-'0'] < 0) n++;
nums[secret.charAt(i)-'0']++;
这个是统计奶牛的数量,因为默认的数组中的所有都为初始值0,给guess中每个数字都记在数组中,secret中一旦出现相同的数字就会找到已经被标记的数字(在数组中的值小于0),并通过加一抵消一个已经找到的相匹配的数,这里还是有点绕,建议结合上述例子看题目。