题目描述
给定一个长度为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;
}