Problem: 2103. 环和杆
每日一题
思路
哈希表
- 取杆记录环上的颜色。
- 由于杆上可能有多条环,导致颜色重复记录,而我们只需要记录杆上颜色种类,设置hashset(唯一颜色)来完成。
位运算
- 将环颜色对应位值(如果三种颜色都有(1110)(二进制)==(7)(十进制))
- 遍历字符串,位运算
- 数组模拟杆编号并记录颜色种类
Code
哈希表
class Solution {
public int countPoints(String rings) {
int len = rings.length();
int res = 0;
Map<Integer, Set<String>> map = new HashMap<>();// 存第i个编号有?种颜色
for (int i = 0; i < len - 1; i += 2) {
// 取字符串-颜色对
String sub = new String(rings.substring(i, i + 2));
int num = sub.charAt(1);
String color = String.valueOf(sub.charAt(0));
if (!map.containsKey(num)) {
// 没有该键值对
map.put(num, new HashSet<>());
}
map.get(num).add(color);// 有-存颜色
}
for (Integer i : map.keySet()) {
if (map.get(i).size() == 3) {
res++;
}
}
return res;
}
}
位运算
class Solution {
public int countPoints(String rings) {
int[] d = new int['Z'];
d['R'] = 1; // 'R' 对应的位值为 1
d['G'] = 2; // 'G' 对应的位值为 2
d['B'] = 4; // 'B' 对应的位值为 4
int[] mask = new int[10]; // 用于存储杆上的颜色种类
for (int i = 0, n = rings.length(); i < n; i += 2) {
int c = rings.charAt(i);
int j = rings.charAt(i + 1) - '0';
mask[j] |= d[c]; // 关键!!!位运算
}
int ans = 0;
// 遍历算结果
for (int x : mask) {
if (x == 7) {
++ans; // 如果位标记为 7,表示三种颜色的环都有。
}
}
return ans;
}
}