栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

338. 比特位计数

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

338. 比特位计数

  1. 比特位计数
题意

给你一个整数 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

题解 1:

思路1:
首先这个题目要计算的是每一个数字上的比特位1的个数并在数组中保存,比较直接的计算方法是对输入的数字N进行遍历,并且遍历每一个数字,右移一位与1进行与操作,

vector ret(num+1);
for(int i = 0;i<=n;i++)
	if(i ==0||i==1)
		{
			ret[i] = i;
		}
		else{
			count = 0;
			for(int j = 0;j<=32;j++){
				if((i>>j)&1!=0)
				{
					continue;
				}else{
					count++;
					}
			}
			ret[i] = count;
		}

但是这样的遍历方法,效率极低,所以采用第二种方法,采用数学归纳的方法并且附带动态规划的方法
如果i为从偶数变为奇数:则在偶数的前提下+1
0 = 0 1 = 1
2 = 10 3 = 11
如果当前i为偶数,则证明下一个偶数是在当前偶数的基础上左移一位计算,末尾为0,所以1的个数没有变化。
2 = 10 4 = 100 8 = 1000
3 = 11 6 = 110 12 = 1100
所以在计算的时候只需要计算0,1,2即可,其中0中的1为0,1中的1个数为0+1;而2中的1的个数为1;其他的各个数字均可以在这个基础上进行演变

class Solution {
public:
    vector countBits(int n) {
        vector ret_vec(n+1);
        ret_vec[0] = 0;        
        for(int i = 1;i<=n;i++){
            if(i & 1 !=0)//奇数
            {
                ret_vec[i] = ret_vec[i-1]+1;
            }else
            {
                ret_vec[i] = ret_vec[i/2];
            }
        }
        return ret_vec;

    }
};

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1021807.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号