题目
题目难度:简单
你正在和你的朋友玩 猜数字(Bulls and Cows)游戏:你写下一个数字让你的朋友猜。每次他猜测后,你给他一个提示,告诉他有多少位数字和确切位置都猜对了(称为“Bulls”, 公牛),有多少位数字猜对了但是位置不对(称为“Cows”, 奶牛)。你的朋友将会根据提示继续猜,直到猜出秘密数字。
请写出一个根据秘密数字和朋友的猜测数返回提示的函数,用 A 表示公牛,用 B 表示奶牛。
请注意秘密数字和朋友的猜测数都可能含有重复数字。
示例 1:
输入: secret = "1807", guess = "7810"
输出: "1A3B"
解释: 1 公牛和 3 奶牛。公牛是 8,奶牛是 0, 1 和 7。
示例 2:
输入: secret = "1123", guess = "0111"
输出: "1A1B"
解释: 朋友猜测数中的第一个 1 是公牛,第二个或第三个 1 可被视为奶牛。
解题
这道理不知道为什么卡了我很久,看了大佬们的解答,果然大佬就是大佬。不过我还是记录我自己的方法,性能一般,但是很好理解。
计算方法:
- 公牛=相同位置的相同字符数
- 母牛=两子串相同字符数-公牛数
步骤:
- 计算出公牛的数目 equ ;通过一个for循环来遍历
- 双重for循环遍历两个数组 ,若两个数组的值一样,same++,接着把secret[i]的值变成‘@’,把guess[i]的值变成‘$’,确保不会再使用到这些用过的值。
总结:
性能真的太一般!得改进
class Solution {
public static String getHint(String secret, String guess) {
char s[] = secret.toCharArray();
char g[] = guess.toCharArray();
int num = s.length;
int equ = 0;
int same = 0;
for(int i = 0 ; i < num; i++){
if(s[i] == g[i]){
equ++;
}
}
for(int j = 0 ; j < num; j++){
for(int k = 0 ; k < num; k++){
if(s[j] == g[k] ){
same++;
s[j] = '@';
g[k] = '$';
break;
}
}
}
same = same-equ;
return equ+"A"+same+"B";
}
}