• 338. 比特位计数


    题目描述

    给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。

    示例 1:

    输入: 2
    输出: [0,1,1]

    示例 2:

    输入: 5
    输出: [0,1,1,2,1,2]

    进阶:

    1. 给出时间复杂度为O(n*sizeof(integer))的解答非常容易。但你可以在线性时间O(n)内用一趟扫描做到吗?
    2. 要求算法的空间复杂度为O(n)。
    3. 你能进一步完善解法吗?要求在C++或任何其他语言中不使用任何内置函数(如 C++ 中的 __builtin_popcount)来执行此操作。

    题意

     随机给出一个稍大的数16,然后从0到16把所有的1的个数列出来,能发现一个规律:

    比如11转化为二进制数时为1011,其1的个数为3,等于8转化为二进制数时(1000)的个数也就是1,加上3(由11-8得到)转化为二进制数时(0011)的个数也就是2.

    那么不禁要问,为什么会有这样的规律。额,我讲不来...意会。

    代码

    class Solution {
    public:
        vector<int> countBits(int nums) {
            vector<int> backVec;
            backVec.push_back(0);
            if (nums == 0)
                ;
            else if (nums == 1)
            {
                backVec.push_back(1);
            }
            else if (nums == 2)
            {
                backVec.push_back(1);
                backVec.push_back(1);
            }
            else
            {
                backVec.push_back(1);
                backVec.push_back(1);
                int theLastestNum = 1;
                for (int i = 3; i <= nums; i++)
                {
                    if (isPowOfTwo(i))
                    {
                        backVec.push_back(1);
                        theLastestNum = i;
                    }
                    else
                    {
                        int another = i - theLastestNum;
                        backVec.push_back(backVec[theLastestNum] + backVec[another]);
                    }
                }
            }
            return backVec;
        }
        
        bool isPowOfTwo(int n)
        {
            /*** 这个函数用来判断n是不是2的几次幂 ***/
            while (n != 1)
            {
                int x = n % 2;
                if(x == 0)
                    n /= 2;
                else
                    return false;
            }
            return true;
        }
    };
    
  • 相关阅读:
    Javascript 加解密
    Netsuite 友好提示
    一中另类调试javascrīpt的好方法
    js 转化为标准日期型
    多站点整合—单点登录简单方案{装载}
    win+e 失效
    (转载)向页面某处动态添加js的方法
    prototype.js源码解读(一)
    Saved search in customer center on tab
    spring boot 加载web容器tomcat流程源码分析
  • 原文地址:https://www.cnblogs.com/shayue/p/10353100.html
Copyright © 2020-2023  润新知