LeetCode 762 二进制表示中质数个计算置位

LeetCode 762 二进制表示中质数个计算置位

题目描述

给定两个整数 LR,找到闭区间 [L, R] 范围内,计算置位位数为质数 的整数个数。

(计算置位位数:二进制表示中 1 的个数)

示例:

复制代码
输入: L = 6, R = 10
输出: 4
解释:
6  (110) -> 2 个 1,2 是质数
7  (111) -> 3 个 1,3 是质数
8 (1000) -> 1 个 1,1 不是质数
9 (1001) -> 2 个 1,2 是质数
10(1010) -> 2 个 1,2 是质数
共计 4 个。

解题思路

题目核心有两个步骤:

  1. 对区间内每个数,统计其二进制中 1 的个数。
  2. 判断该个数是否为质数。

关键点分析

  • 二进制 1 的个数可以通过位运算快速得到:不断右移并检查最低位。
  • 质数判断:由于本题数据范围 L, R <= 10^6,二进制最多有 20 位(2^20 = 1048576),因此 1 的个数最多为 20。我们可以预先将 20 以内的所有质数列出(2, 3, 5, 7, 11, 13, 17, 19),直接查表即可,无需每次判断质数。

代码实现(C++)

cpp 复制代码
class Solution {
public:
    int countPrimeSetBits(int left, int right) {
        unordered_set<int> primes{2, 3, 5, 7, 11, 13, 17, 19}; // 20 以内的所有质数
        int res = 0;
        for (int i = left; i <= right; ++i) {
            int s = 0;
            // 计算 i 的二进制中 1 的个数
            for (int j = i; j; j >>= 1) s += j & 1;
            res += primes.count(s);
        }
        return res;
    }
};

代码解释

  1. 质数集合
    unordered_set<int> primes{2,3,5,7,11,13,17,19};

    因为最大可能置位位数不超过 20,所以预先存储 20 以内的质数,用于 O(1) 判断。

  2. 遍历区间
    for (int i = left; i <= right; ++i) 枚举区间内每个数。

  3. 计算置位位数

    内层循环 for (int j = i; j; j >>= 1)j 不断右移,直到 j 变为 0。
    s += j & 1 每次取最低位(0 或 1)累加到 s 中,最终 s 即为二进制中 1 的个数。

  4. 结果累加
    if (primes.count(s)) ++res;s 是质数,则答案加 1。

复杂度分析

  • 时间复杂度 :区间长度为 n = right - left + 1,每个数需要循环其二进制位数,最多 20 次,因此总时间复杂度为 O(n * 20),即线性时间。
  • 空间复杂度:仅使用了常数大小的额外空间(质数集合)。

总结

本题巧妙之处在于数据范围决定了置位位数有限,因此可以预先列出质数,避免了动态判断质数的开销。位运算统计 1 的个数也是非常基础且高效的技巧

相关推荐
计算机安禾10 分钟前
【数据结构与算法】第22篇:线索二叉树(Threaded Binary Tree)
c语言·开发语言·数据结构·学习·算法·链表·visual studio code
算法鑫探24 分钟前
解密2025数字密码:数位统计之谜
c语言·数据结构·算法·新人首发
计算机安禾33 分钟前
【数据结构与算法】第21篇:二叉树遍历的经典问题:由遍历序列重构二叉树
c语言·数据结构·学习·算法·重构·visual studio code·visual studio
信奥胡老师44 分钟前
P1255 数楼梯
开发语言·数据结构·c++·学习·算法
爱睡懒觉的焦糖玛奇朵2 小时前
【工业级落地算法之人员摔倒检测算法详解】
人工智能·python·深度学习·神经网络·算法·yolo·目标检测
小辉同志2 小时前
78. 子集
算法·leetcode·深度优先
Book思议-2 小时前
【数据结构】二叉树入门全解:从定义、性质到经典真题
数据结构·算法·二叉树
stolentime3 小时前
通信题:洛谷P15942 [JOI Final 2026] 赌场 / Casino题解
c++·算法·洛谷·joi·通信题
初生牛犊不怕苦3 小时前
与AI一起学习《C专家编程》:数组与指针
c语言·学习·算法
Kk.08024 小时前
数据结构|排序算法(二) 冒泡排序
数据结构·算法·排序算法