文章目录
- 1. 题目信息
- 2. 解题
- 拓展:求一个数n的2进制有多少个1?
- LeetCode 338
1. 题目信息
给定一个整数,编写一个函数来判断它是否是 2 的幂次方。
示例 1:输入: 1
输出: true
解释: 20 = 1
示例 2:输入: 16
输出: true
解释: 24 = 16
示例 3:输入: 218
输出: false
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/power-of-two
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题
- 2的整数次幂的2进制数中只有1个1
- n经过
运算 n&(n-1)
得到的数的二进制1的个数减少1个
class Solution {
public:bool isPowerOfTwo(int n) {if(n <= 0)return false;return (n&(n-1)) == 0;//错误写法 n&(n-1) == 0}
};
拓展:求一个数n的2进制有多少个1?
int count = 0, num = 8;
while(num)
{count++;num = num&(num-1);
}
std::cout << count << std::endl;
LeetCode 338
给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。
class Solution {
public:vector<int> countBits(int num) {int count, temp;vector<int> ans;for(int i = 0; i <= num; ++i){count = 0;temp = i;while(temp){temp &= (temp-1);++count;}ans.push_back(count);}return ans;}
};
对338题还可以用动态规划
- dp[0] = 0
奇数 | 偶数 |
---|---|
1-‘01’-dp[1]=1 | 2-‘10’-dp[2]=1 |
3-‘11’-dp[3]=2 | 4-‘100’-dp[4]=1 |
5-‘101’-dp[5]=2 | 6-‘110’-dp[6]=2 |
7-‘111’-dp[7]=3 | 8-‘1000’-dp[8]=1 |
n为奇数,dp[n]=dp[n−1]+1n为奇数,dp[n] = dp[n-1]+1n为奇数,dp[n]=dp[n−1]+1,比前面的多1,好理解
n为偶数,dp[n]=dp[n/2]n为偶数,dp[n]=dp[n/2]n为偶数,dp[n]=dp[n/2],2的倍数,只需要移动位数就可以,1个数不变
class Solution {
public:vector<int> countBits(int num) {vector<int> ans(num+1);ans[0] = 0;for(int i = 0; i <= num; ++i){if(i % 2 == 1){ans[i] = ans[i-1] + 1;}else{ans[i] = ans[i/2];}}return ans;}
};