AcWing
  • 首页
  • 题库
  • 题解
  • 分享
  • 问答
  • 活动
  • 应用
  • 吐槽
  • 登录/注册

AcWing 801. 二进制中1的个数    原题链接    简单

作者: 作者的头像   CodeWater ,  2021-02-22 18:53:38 ,  阅读 15


0


题目描述

原题

给定一个长度为n的数列,请你求出数列中每个数的二进制表示中1的个数。

输入格式
第一行包含整数n。

第二行包含n个整数,表示整个数列。

输出格式
共一行,包含n个整数,其中的第 i 个数表示数列中的第 i 个数的二进制表示中1的个数。

数据范围
1≤n≤100000,
0≤数列中元素的值≤109

输入样例:

5
1 2 3 4 5

输出样例:

1 1 2 1 2


算法:位运算

lowbit操作。就是看一个数的二进制表示他的右边第一个1是在第几位。比如100101000这个二进制数,
他的lowbit就是1000.这个通常用来看一个二进制数里面有多少个1.因为每次lowbit之后,我们把右边
的1去掉,然后继续lowbit,直到最后都去掉之后就可以累加算出这个二进制数里面有多少个1.

时间复杂度

O(nlogn)

参考文献

y总讲解视频

C++ 代码

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

//lowbit运算
int lowBit(int x){
    return x & -x;
}

int main(){
    int n;
    cin>>n;

    while(n--){  
        int res = 0;
        int x;
        cin>>x;
        //每次减掉最右边的1,答案记录加1,直到为0就结束
        while(x) x -= lowBit(x), res ++;
        cout<<res<<' ';
    }

    return 0;
}

0 评论

你确定删除吗?

© 2018-2021 AcWing 版权所有  |  京ICP备17053197号-1
联系我们  |  常见问题
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标
请输入绑定的邮箱地址
请输入注册信息