zoukankan      html  css  js  c++  java
  • 刷题-力扣-剑指 Offer II 003. 前 n 个数字二进制中 1 的个数

    剑指 Offer II 003. 前 n 个数字二进制中 1 的个数

    题目链接

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/w3tCBm
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    题目描述

    给定一个非负整数 n ,请计算 0 到 n 之间的每个数字的二进制表示中 1 的个数,并输出一个数组。

    示例 1:

    输入: n = 2
    输出: [0,1,1]
    解释: 
    0 --> 0
    1 --> 1
    2 --> 10
    

    示例 2:

    输入: n = 5
    输出: [0,1,1,2,1,2]
    解释:
    0 --> 0
    1 --> 1
    2 --> 10
    3 --> 11
    4 --> 100
    5 --> 101
    

    说明 :

    • 0 <= n <= 105

    进阶:

    • 给出时间复杂度为 O(n*sizeof(integer)) 的解答非常容易。但你可以在线性时间 O(n) 内用一趟扫描做到吗?
    • 要求算法的空间复杂度为 O(n) 。
    • 你能进一步完善解法吗?要求在C++或任何其他语言中不使用任何内置函数(如 C++ 中的 __builtin_popcount )来执行此操作。
       
      注意:本题与主站 338 题相同:https://leetcode-cn.com/problems/counting-bits/

    题目分析

    1. 根据题目描述计算0-n中n+1个数的二进制中1的个数
    2. calcOneNum用来计算一个数的二进制中1的个数

    代码

    class Solution {
    public:
        vector<int> countBits(int n) {
            std::vector<int> dp;
            for (int i = 0; i <= n; ++i) {
                dp.emplace_back(calcOneNum(i));
            }
            return dp;
        }
    private:
        int calcOneNum(int n) {
            int sum = 0;
            while (n) {
                sum += n % 2;
                n = n / 2;
            }
            return sum;
        } 
    };
    
  • 相关阅读:
    C++之STL一般总结
    QT学习第2天
    Linux下Awk详解(转载)
    Mac下开启FTPserver
    Mac下QT错误,Xcode配置解决办法
    C++之STL
    关于Java自动拆箱装箱中的缓存问题
    二分查找
    冒泡排序及优化
    Java中String常用方法总结
  • 原文地址:https://www.cnblogs.com/HanYG/p/15304988.html
Copyright © 2011-2022 走看看