力扣打卡:299. 猜数字游戏
解题思路
首先定义两个变量 a 和 b
,变量a统计公牛数,变量b统计奶牛个数
思路:
- 如果
secret.charAt(i)==guess.charAt(i)
那么a++;
- 如果 不相等
- 使用两个
HashMap
进行统计两个字符串的不相同字符
- 使用两个
- 变量两个
HashMap
,取出最小值
代码
class Solution {
public String getHint(String secret, String guess) {
// 思路:因为两个字符串相等,首先遍历两个字符串,
// 在遍历时,如果遇到了secret.charAt(i)==guess.charAt(i),那么a变量就增加
// 如果不相等时,那么使用两个HashMap进行统计个数,最后进行两个Map的遍历,如果包含取最小值
HashMap<Character,Integer> map1 = new HashMap<>();
HashMap<Character,Integer> map2 = new HashMap<>();
int a=0, b=0;
for(int i=0; i<secret.length(); i++){ // String.length()方法的时间复杂度为 O(1)
if(secret.charAt(i)==guess.charAt(i)){
a++;
}else{
char c1 = secret.charAt(i);
char c2 = guess.charAt(i);
map1.put(c1,map1.getOrDefault(c1,0)+1);
map2.put(c2,map2.getOrDefault(c2,0)+1);
}
}
for(Map.Entry<Character,Integer> entry : map1.entrySet()){
if(map2.containsKey(entry.getKey())){
b += Math.min(map2.get(entry.getKey()),entry.getValue());
}
}
return a+"A"+b+"B";
}
}
优化
使用数组来减少复杂的的判断
- 只含有是个数字,所以生成两个长度为10的数组
- 对字符串进行遍历
- 如果相等,那么使a增加1
- 如果不相等,
arr1[ secret.charAt(i)-'0' ]++; arr2[guess.charAt(i) - '0']++;
,也就是直接利用数组
- 最后 使用
b += Math.min(arr1[i], arr2[i]);
,即可(因为不含有的数字为0)