2024.3.10
- 题目来源
- 我的题解
- 方法一 哈希表
- 方法二 使用数组优化
题目来源
力扣每日一题;题序:299
我的题解
方法一 哈希表
使用哈希表记录secret中每个数字出现的次数,然后遍历guess的每一位,再判断与secret对应位置是否相同,若相同则A加1(注意,这时要看哈希表中对应数字的可使用次数是否等于0,若等于0则表示前面的B多记录了一次,需要删除),否则看哈希表对应的数字是否还有可使用次数,若有则B加1 。
时间复杂度:O(n)
空间复杂度:O(n)
public String getHint(String secret, String guess) {int n=secret.length();//记录secret中每个数字出现的次数Map<Character,Integer> map=new HashMap<>();for(char ch:secret.toCharArray()){map.put(ch,map.getOrDefault(ch,0)+1);}int A=0;int B=0;for(int i=0;i<n;i++){char s=secret.charAt(i);char g=guess.charAt(i);// guess和secret对应i位置的数字相同if(s==g){A++;int count=map.get(s);//看哈希表中对应数字的可使用次数是否等于0,若等于0则表示前面的B多记录了一次,需要删除if(count==0){B--;}else {map.put(s, map.get(s) - 1);}}else{// 看哈希表对应的数字是否还有可使用次数if(map.getOrDefault(g,0)!=0){B++;map.put(g,map.get(g)-1);}}}return A+"A"+B+"B";
}
方法二 使用数组优化
时间复杂度:O(n)
空间复杂度:O( C) C=10
public String getHint(String secret, String guess) {int bulls = 0;int[] cntS = new int[10];int[] cntG = new int[10];for (int i = 0; i < secret.length(); ++i) {if (secret.charAt(i) == guess.charAt(i)) {++bulls;} else {++cntS[secret.charAt(i) - '0'];++cntG[guess.charAt(i) - '0'];}}int cows = 0;for (int i = 0; i < 10; ++i) {cows += Math.min(cntS[i], cntG[i]);}return Integer.toString(bulls) + "A" + Integer.toString(cows) + "B";
}
有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈😄~