1.自己的做法
class Solution {
public String getHint(String secret, String guess) {
int a=0,b=0;
char[] sc = secret.toCharArray();
char[] gs = guess.toCharArray();
for(int i=0;i<gs.length;i++){
if(gs[i] == sc[i]){
a++;
sc[i]='A';
}
}
for(int i=0;i<gs.length;i++){
if(sc[i] != 'A'){
for(int j=0;j<sc.length;j++){
if(gs[i] == sc[j]){
b++;
sc[j]='B';
break;
}
}
}
}
return a+"A"+b+"B";
}
}
这种做法,分为两步,
1.首先要把“公牛”找出,就是说把数字和位置都猜对的位置找出来,并且要在 secret数组打标记,说明这个位置已经用过了,不能让guess数组中重复的数字 重复使用secret中的数字
2.然后就要找“奶牛”,找奶牛的一个条件是 如果sc[i]='A',这个guess位置上的判定过了,就跳过
2.题解
class Solution {
public String getHint(String secret, String guess) {
int a=0,b=0;
int[] s = new int[10];
int[] g = new int[10];
for(int i=0;i<secret.length();i++){
s[secret.charAt(i)-'0']++;
g[guess.charAt(i)-'0']++;
if(secret.charAt(i) == guess.charAt(i)) a++;
}
for(int i=0;i<s.length;i++){
b+=Math.min(s[i],g[i]);
}
return a+"A"+(b-a)+"B";
}
}
这个做法的角度是统计secret和guess中各种数字出现的次数,放在s[],g[]中,每个i位置放的就是数字i出现的频率
第一个循环很好理解
第二个循环指的是 遍历s数组,取s[i]和g[i]中的较小数
取较小数的意思是指,比如在secret中1出现了5 次,在guess中出现了3次 肯定取最小数
这个最后得到的b其实是公牛和奶牛的组合,所以要用b-a
今天差点忘了2020.9.27