• leetcode-每日一题-二进制表示中质数个计算置位(简单,popcount算法)


    从这道题了解到了一个时间复杂度为o(1)的一个计算一个数转换为二进制时1存在的个数问题,很巧妙运用了二分来求解,代码如下

    1. unsigned popcount (unsigned u)
    2. {
    3. u = (u & 0x55555555) + ((u >> 1) & 0x55555555);
    4. u = (u & 0x33333333) + ((u >> 2) & 0x33333333);
    5. u = (u & 0x0F0F0F0F) + ((u >> 4) & 0x0F0F0F0F);
    6. u = (u & 0x00FF00FF) + ((u >> 8) & 0x00FF00FF);
    7. u = (u & 0x0000FFFF) + ((u >> 16) & 0x0000FFFF);
    8. return u;
    9. }

     这个是求解质数的一个小算法,也很不错网上很多大佬都有讲解

    1. bool isPrime(int num) {
    2. if (num <= 3) {
    3. return num > 1;
    4. }
    5. // 不在6的倍数两侧的一定不是质数
    6. if (num % 6 != 1 && num % 6 != 5) {
    7. return false;
    8. }
    9. int s = sqrt(num);
    10. for (int i = 5; i <= s; i += 6) {
    11. if (num % i == 0 || num % (i + 2) == 0) {
    12. return false;
    13. }
    14. }
    15. return true;
    16. }

    这个原理大家可以用一个实例去试一下还是比较易懂的,比原始暴力求解快一点。

    给你两个整数 left 和 right ,在闭区间 [left, right] 范围内,统计并返回 计算置位位数为质数 的整数个数。

    计算置位位数 就是二进制表示中 1 的个数。

    例如, 21 的二进制表示 10101 有 3 个计算置位。
     

    示例 1:

    输入:left = 6, right = 10
    输出:4
    解释:
    6 -> 110 (2 个计算置位,2 是质数)
    7 -> 111 (3 个计算置位,3 是质数)
    9 -> 1001 (2 个计算置位,2 是质数)
    10-> 1010 (2 个计算置位,2 是质数)
    共计 4 个计算置位为质数的数字。
    示例 2:

    输入:left = 10, right = 15
    输出:5
    解释:
    10 -> 1010 (2 个计算置位, 2 是质数)
    11 -> 1011 (3 个计算置位, 3 是质数)
    12 -> 1100 (2 个计算置位, 2 是质数)
    13 -> 1101 (3 个计算置位, 3 是质数)
    14 -> 1110 (3 个计算置位, 3 是质数)
    15 -> 1111 (4 个计算置位, 4 不是质数)
    共计 5 个计算置位为质数的数字。
     

    提示:

    1 <= left <= right <= 106
    0 <= right - left <= 104

    1. bool isPrime(int num) {
    2. if (num <= 3) {
    3. return num > 1;
    4. }
    5. // 不在6的倍数两侧的一定不是质数
    6. if (num % 6 != 1 && num % 6 != 5) {
    7. return false;
    8. }
    9. int s = sqrt(num);
    10. for (int i = 5; i <= s; i += 6) {
    11. if (num % i == 0 || num % (i + 2) == 0) {
    12. return false;
    13. }
    14. }
    15. return true;
    16. }
    17. unsigned popcount (unsigned u)
    18. {
    19. u = (u & 0x55555555) + ((u >> 1) & 0x55555555);
    20. u = (u & 0x33333333) + ((u >> 2) & 0x33333333);
    21. u = (u & 0x0F0F0F0F) + ((u >> 4) & 0x0F0F0F0F);
    22. u = (u & 0x00FF00FF) + ((u >> 8) & 0x00FF00FF);
    23. u = (u & 0x0000FFFF) + ((u >> 16) & 0x0000FFFF);
    24. return u;
    25. }
    26. int countPrimeSetBits(int left, int right){
    27. int num=0;
    28. for(int i=left;i<=right;i++)
    29. {
    30. if (isPrime(popcount(i))) {
    31. num++;
    32. }
    33. }
    34. return num;
    35. }

     

     

  • 相关阅读:
    【RC&RL充放电时间相关计算】
    24、Flink 的table api与sql之Catalogs(java api操作视图)-3
    数据结构中的判定转状态+扫描线:P1502
    深入浅出排序算法之直接插入排序(拓展:折半插入排序)
    免费 AI 代码生成器 Amazon CodeWhisperer 初体验
    window10环境构建和运行skia源码
    SPDK NVMe-oF target多路功能介绍
    MySQL——六、库表操作(下篇)
    【Docker系列】跨平台 Docker 镜像构建:深入理解`--platform`参数
    Python常见报错及解决方案,建议收藏
  • 原文地址:https://blog.csdn.net/qq_59002046/article/details/128212680