思路:二进制中最右边1设置为0(n & (n - 1))
int hammingWeight(uint32_t n) {
int res = 0;
while(n) {
n = n & (n - 1);
res = res + 1;
}
return res;
}
思路:int转化为32位进行统计
int majorityElement(vector<int>& nums) {
if (nums.size() == 1) {
return nums[0];
}
int res = 0;
for (int i = 0; i < 32; i++) {
int temp = 0;
for (int j = 0; j < nums.size(); j++) {
//每一位是否为1
if (nums[j] >> i & 1) {
temp += 1;
}
}
if (temp > nums.size() / 2) {
res += 1 << i;
}
}
return res;
}
//&、^两个运算符使用
vector<int> singleNumbers(vector<int>& nums) {
int a = nums[0];
for (int i = 1;i < nums.size(); i++) {
a = a ^ nums[i];
}
//保留最后一位1
int k = a & (-a);
int n1 = 0, n2 = 0;
for (int i = 0; i < nums.size(); i++) {
if (nums[i] & k) {
n1 = n1 ^ nums[i];
} else {
n2 = n2 ^ nums[i];
}
}
vector<int> res;
res.push_back(n1);
res.push_back(n2);
return res;
}
4.剑指 Offer 56 - II. 数组中数字出现的次数 II
int singleNumber(vector<int>& nums) {
int res = 0;
for (int i = 0; i < 32; i++) {
int count = 0;
for (int j = 0; j < nums.size(); j++) {
count += nums[j] >> i & 1;
}
res += count % 3 << i;
}
return res;
}
int findComplement(int num) {
long long res = 0;
for (int i = 0; i < 31; i++) {
//补数,需要考虑比num小的数
if ((num >> i & 1) == 0 && ((1 << i) < num)) {
res += 1 << i;
}
}
return res;
}