LeetCode-2103. 环和杆-哈希表(朴素)+位运算

Problem: 2103. 环和杆
每日一题

文章目录

  • 思路
    • 哈希表
    • 位运算
  • Code
    • 哈希表
    • 位运算

思路

哈希表

  1. 记录上的颜色。
  2. 由于杆上可能有多条环,导致颜色重复记录,而我们只需要记录杆上颜色种类,设置hashset(唯一颜色)来完成。

位运算

思路来源:ylb

  1. 将环颜色对应位值(如果三种颜色都有(1110)(二进制)==(7)(十进制))
  2. 遍历字符串,位运算
  3. 数组模拟杆编号并记录颜色种类

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;  
    }
}

你可能感兴趣的:(算法学习与刷题,leetcode,散列表,算法)