【LeetCode】每日一题 2023_11_2 环和杆(题目质量不错)

文章目录

  • 刷题前唠嗑
  • 题目:环和杆
    • 题目描述
    • 代码与解题思路
    • 看看别人的题解
  • 结语

刷题前唠嗑

今天是简单,我快乐了

题目:环和杆

题目链接:2103. 环和杆

题目描述

【LeetCode】每日一题 2023_11_2 环和杆(题目质量不错)_第1张图片

代码与解题思路

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
}

用二进制的位来做标志位,只需要用 ‘|’ 就能判断这个颜色存不存在杆子上,学会了,以后遇到这类都需要标志位的问题就可以用位运算来解决。

结语

今天的每日一题质量还是不错的的,值得一刷

你可能感兴趣的:(LeetCode,每日一题,leetcode,算法,职场和发展)