加载中...
338-比特位计数(Counting Bits)
发表于:2021-12-03 | 分类: 简单
字数统计: 645 | 阅读时长: 3分钟 | 阅读量:

原文链接: https://leetcode-cn.com/problems/counting-bits

英文原文

Given an integer n, return an array ans of length n + 1 such that for each i (0 <= i <= n), ans[i] is the number of 1's in the binary representation of i.

 

Example 1:

Input: n = 2
Output: [0,1,1]
Explanation:
0 --> 0
1 --> 1
2 --> 10

Example 2:

Input: n = 5
Output: [0,1,1,2,1,2]
Explanation:
0 --> 0
1 --> 1
2 --> 10
3 --> 11
4 --> 100
5 --> 101

 

Constraints:

  • 0 <= n <= 105

 

Follow up:

  • It is very easy to come up with a solution with a runtime of O(n log n). Can you do it in linear time O(n) and possibly in a single pass?
  • Can you do it without using any built-in function (i.e., like __builtin_popcount in C++)?

中文题目

给你一个整数 n ,对于 0 <= i <= n 中的每个 i ,计算其二进制表示中 1 的个数 ,返回一个长度为 n + 1 的数组 ans 作为答案。

 

示例 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 log n) 的解决方案,你可以在线性时间复杂度 O(n) 内用一趟扫描解决此问题吗?
  • 你能不使用任何内置函数解决此问题吗?(如,C++ 中的 __builtin_popcount

通过代码

高赞题解

思路

对于所有的数字,只有两类:

  1. 奇数:二进制表示中,奇数一定比前面那个偶数多一个 1,因为多的就是最低位的 1。
  •        举例: 
             0 = 0       1 = 1
             2 = 10      3 = 11
    
  1. 偶数:二进制表示中,偶数中 1 的个数一定和除以 2 之后的那个数一样多。因为最低位是 0,除以 2 就是右移一位,也就是把那个 0 抹掉而已,所以 1 的个数是不变的。
  •          举例:
              2 = 10       4 = 100       8 = 1000
              3 = 11       6 = 110       12 = 1100
    
    另外,0 的 1 个数为 0,于是就可以根据奇偶性开始遍历计算了。

    代码

    vector<int> countBits(int num) {
            vector<int> result(num+1);
            result[0] = 0;
            for(int i = 1; i <= num; i++)
            {
                if(i % 2 == 1)
                {
                    result[i] = result[i-1] + 1;
                }
                else
                {
                    result[i] = result[i/2];
                }
            }
            
            return result;
        }

统计信息

通过次数 提交次数 AC比率
169964 216051 78.7%

提交历史

提交时间 提交结果 执行时间 内存消耗 语言

相似题目

题目 难度
位1的个数 简单
上一篇:
337-打家劫舍 III(House Robber III)
下一篇:
341-扁平化嵌套列表迭代器(Flatten Nested List Iterator)
本文目录
本文目录