文章目录
- 刷题前唠嗑
- 题目:环和杆
- 题目描述
- 代码与解题思路
- 看看别人的题解
- 结语
刷题前唠嗑
今天是简单,我快乐了
题目:环和杆
题目链接:2103. 环和杆
题目描述
代码与解题思路
func countPoints(rings string) (ans int) {
num := [10][3]int{}
ch := 0
for i := 0; i < len(rings); i += 2 {
if rings[i] == 'R' {
ch = 0
} else if rings[i] == 'G' {
ch = 1
} else if rings[i] == 'B' {
ch = 2
}
num[rings[i+1]-'0'][ch]++
}
for _, v1 := range num {
cnt := 0
for _, v2 := range v1 {
if v2 > 0 {
cnt++
}
}
if cnt == 3 { // 三个标志位都有数,证明集齐了所有颜色
ans++
}
}
return ans
}
这道题虽然是简单,但是做起来还是有点难受的,LeetCode 特有的简单题不一定真的简单。我来讲讲我的思路,总的来说,用的是哈希思想+暴力:
我设置了一个二维数组,10 行代表着 0~9 这 10 根杆子,3 列代表着三种颜色是否出现,第一次循环的时候我给每个颜色分配了一个位置,出现了哪个颜色就在对应的杆子上的标志位++
第二次循环就是暴力遍历整个二维数组,遍历每个杆子的标志位,如果标志位上都有标志,也就是 cnt == 3,就证明这个杆子上集齐了所有的颜色。
看看别人的题解
我趣,天才,可以用位运算来做:
func countPoints(rings string) (ans int) {
mapping := map[byte]int{
'R': 1, // 001
'G': 2, // 010
'B': 4, // 100
}
st := [10]int{}
for i := 0; i < len(rings); i += 2 {
st[rings[i+1]-'0'] |= mapping[rings[i]]
}
for _, v := range st {
if v == 7 { // v == 111
ans++
}
}
return ans
}
用二进制的位来做标志位,只需要用 ‘|’ 就能判断这个颜色存不存在杆子上,学会了,以后遇到这类都需要标志位的问题就可以用位运算来解决。
结语
今天的每日一题质量还是不错的的,值得一刷