前言
跟着英雄哥打卡第四十二天
[专题跳转->《算法零基础100讲》]
[万人千题社区跳转]
[LeetCode零基础指南]
一、位1的个数
跳转力扣:191. 位1的个数
难度:★☆☆☆☆
说明:位运算,判断最低位是否为1,是则加1,每次循环右移一位继续判断
代码如下(示例):
class Solution {
public:
int hammingWeight(uint32_t n) {
int ans = 0;
while (n) {
if (n & 1)
ans ++;
n >>= 1;
}
return ans;
}
};
二、二进制中1的个数
跳转力扣:剑指 Offer 15. 二进制中1的个数
难度:★☆☆☆☆
说明:位运算,与上题相同,提供另一个方法,参考
lowbit(x)
方法:lowbit(x)
是 x x x 的二进制表达式中最低位的1所对应的值。如 6 6 6 的二进制是 110,所以 l o w b i t ( 6 ) = 2 lowbit(6) = 2 lowbit(6)=2, n − l o w b i t ( n ) = 6 − l o w b i t ( 6 ) = 6 − 2 = 4 = ( 100 ) n - lowbit(n) = 6 - lowbit(6) = 6 - 2 = 4 = (100) n−lowbit(n)=6−lowbit(6)=6−2=4=(100)2
代码如下(示例):
class Solution {
public:
int lowbit(uint32_t x){
return x & (-x);
}
int hammingWeight(uint32_t n) {
int ans = 0;
while (n){
n -= lowbit(n);
ans ++;
}
return ans;
}
};
三、根据数字二进制下 1 的数目排序
跳转力扣:1356. 根据数字二进制下 1 的数目排序
难度:★☆☆☆☆
说明:位运算,排序,计算每一个数二进制1的个数,根据个数从小到大排序即为答案所求
代码如下(示例):
typedef pair<int, int> pii;
class Solution {
public:
vector<int> sortByBits(vector<int>& arr) {
int n = arr.size();
vector<pii> ans;
vector<int> res;
for (int i = 0; i < n; i ++) {
int cnt = 0;
pii p;
p.second = arr[i];
while (arr[i]) {
if (arr[i] & 1)
cnt ++;
arr[i] >>= 1;
}
p.first = cnt;
ans.push_back(p);
}
sort(ans.begin(), ans.end());
for (auto &a: ans)
res.push_back(a.second);
return res;
}
};
四、二进制表示中质数个计算置位
跳转力扣:762. 二进制表示中质数个计算置位
难度:★☆☆☆☆
说明:位运算,计算从 l e f t left left 到 r i g h t right right 的每一位数的二进制数中1出现的个数,再判断个数是否为质数,是则计数加①
代码如下(示例):
class Solution {
public:
bool isPrime(int n) {
if (n < 2) return false;
for (int i = 2; i <= n / i; i ++) {
if (n % i == 0)
return false;
}
return true;
}
int countPrimeSetBits(int left, int right) {
int ans = 0;
for (int i = left; i <= right; i ++) {
int cnt = 0;
int n = i;
while (n) {
if (n & 1)
cnt ++;
n >>= 1;
}
if (isPrime(cnt))
ans ++;
}
return ans;
}
};
五、2 的幂
跳转力扣:231. 2 的幂
难度:★☆☆☆☆
说明:位运算,参考题二
lowbit(x)
方法
代码如下(示例):
class Solution {
public:
bool isPowerOfTwo(int n) {
return n > 0 && (n & -n) == n;
}
};