题目地址:
https://www.lintcode.com/problem/bulls-and-cows/description
一个猜数字游戏,给定两个字符串 s s s和 g g g, s s s是要猜的字符串, g g g是猜测的字符串,如果 g g g猜中了数字和位置,则记 x x x个,如果猜中了数字但位置不对,则记 y y y个,返回 x A y B xAyB xAyB这样的字符串。
用一个哈希表记录 s s s中每个字符串出现了多少次,然后遍历 g g g,如果发现位置相同的字符也相同,则记 A A A的数加 1 1 1,并把这个字符从哈希表里次数减去 1 1 1;如果发现不同,但哈希表里有,则记 B B B的数加 1 1 1,并也把这个字符从哈希表里次数减去 1 1 1。代码如下:
import java.util.HashMap;
import java.util.Map;
public class Solution {
public String getHint(String secret, String guess) {
// write your code here
Map<Character, Integer> map = new HashMap<>();
for (int i = 0; i < secret.length(); i++) {
map.put(secret.charAt(i), map.getOrDefault(secret.charAt(i), 0) + 1);
}
int A = 0, B = 0;
for (int i = 0; i < guess.length(); i++) {
char g = guess.charAt(i);
if (g == secret.charAt(i)) {
A++;
map.put(g, map.get(g) - 1);
} else {
if (map.containsKey(g)) {
B++;
map.put(g, map.get(g) - 1);
// 如果g被删光了,则从哈希表里也删除
if (map.get(g) == 0) {
map.remove(g);
}
}
}
}
return A + "A" + B + "B";
}
}
时空复杂度 O ( l s ) O(l_s) O(ls)。