【每日一题】环和杆

文章目录

  • Tag
  • 题目来源
  • 题目解读
  • 解题思路
    • 方法一:位运算
  • 其他语言
    • python3
  • 写在最后

Tag

【位运算】【2023-11-02】


题目来源

2103. 环和杆

【每日一题】环和杆_第1张图片

题目解读

找出集齐全部三种颜色的杆,并返回这种杆的数量。


解题思路

方法一:位运算

统计每个位置上的不同颜色的环数目,如果某一个位置上的不同颜色环的数目为 3,则该位置集齐了全部三种颜色。

统计每个位置上的不同颜色的环数目可以使用位运算来计算,维护一个数组 idxs 表示每个位置上的位运算结果,初始每个位置上值为 0,遍历 rings 中的每一个位置以及颜色,遇到红色的环就或上 1,遇到绿色的环就或上 2,遇到蓝色的环就或上 4。最后统计数组 idxs 中值为 7 的数量,即为最后的答案。

实现代码

class Solution {
public:
    int countPoints(string rings) {
        vector<int> idxs(10, 0);
        int n = rings.size();
        for (int i = 0; i < n-1; i += 2) {
            char color = rings[i];
            int idx = rings[i+1] - '0';
            if (color == 'R') {
                idxs[idx] |= 1;
            }
            else if (color == 'G') {
                idxs[idx] |= 2;
            }
            else {
                idxs[idx] |= 4;
            }
        }
        int res = 0;
        for (int i = 0; i < 10; ++i) {
            if (idxs[i] == 7) {
                ++res;
            }
        }
        return res;
    }
};

复杂度分析

时间复杂度: O ( n ) O(n) O(n) n n nrings 的长度。

空间复杂度: O ( 1 ) O(1) O(1)


其他语言

python3

参考自 官方题解

class Solution:
    def countPoints(self, rings: str) -> int:
        POLE_NUM = 10
        mapping = {'R' : 0, 'G' : 1, 'B' : 2}
        state = [0] * POLE_NUM
        for i in range (0, len(rings), 2):
            color = rings[i]
            pole_index = ord(rings[i + 1]) - ord('0')
            state[pole_index] |= 1 << mapping[color]
        return sum(state[i] == 7 for i in range(POLE_NUM))

写在最后

如果文章内容有任何错误或者您对文章有任何疑问,欢迎私信博主或者在评论区指出 。

如果大家有更优的时间、空间复杂度方法,欢迎评论区交流。

最后,感谢您的阅读,如果感到有所收获的话可以给博主点一个 哦。

你可能感兴趣的:(LeetCode每日一题,位运算,2023-11-02,C++,python3,算法)