【位运算】【2023-11-02】
2103. 环和杆
找出集齐全部三种颜色的杆,并返回这种杆的数量。
统计每个位置上的不同颜色的环数目,如果某一个位置上的不同颜色环的数目为 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 n 为 rings
的长度。
空间复杂度: O ( 1 ) O(1) O(1)。
参考自 官方题解
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))
如果文章内容有任何错误或者您对文章有任何疑问,欢迎私信博主或者在评论区指出 。
如果大家有更优的时间、空间复杂度方法,欢迎评论区交流。
最后,感谢您的阅读,如果感到有所收获的话可以给博主点一个 哦。