LeetCodeAnimation/notes/LeetCode第231号问题:2的幂.md

84 lines
2.0 KiB
Java
Raw Normal View History

2019-05-13 09:08:48 +08:00
# LeetCode 231 号问题2 的幂
> 本文首发于公众号五分钟学算法[图解 LeetCode ](<https://github.com/MisterBooo/LeetCodeAnimation>)系列文章之一。
>
> 个人网站[https://www.cxyxiaowu.com](https://www.cxyxiaowu.com)
题目来源于 LeetCode 上第 231 号问题2 的幂题目难度为 Easy目前通过率为 45.6%
### 题目描述
给定一个整数编写一个函数来判断它是否是 2 的幂次方
**示例 1:**
```
输入: 1
输出: true
解释: 2^0 = 1
2019-05-13 09:08:48 +08:00
```
**示例 2:**
```
输入: 16
输出: true
解释: 2^4 = 16
2019-05-13 09:08:48 +08:00
```
**示例 3:**
```
输入: 218
输出: false
```
### 题目解析
首先先来分析一下 2 的次方数的二进制写法
2019-11-14 11:00:28 +08:00
![表格](https://blog-1257126549.cos.ap-guangzhou.myqcloud.com/blog/3wdpd.jpg)
2019-05-13 09:08:48 +08:00
仔细观察可以看出 2 的次方数都只有一个 1 剩下的都是 0 根据这个特点只需要每次判断最低位是否为 1 然后向右移位最后统计 1 的个数即可判断是否是 2 的次方数
代码很简单
```c++
class Solution {
public:
bool isPowerOfTwo(int n) {
int cnt = 0;
while (n > 0) {
cnt += (n & 1);
n >>= 1;
}
return cnt == 1;
}
};
```
该题还有一种巧妙的解法再观察上面的表格如果一个数是 2 的次方数的话那么它的二进数必然是最高位为1其它都为 0 那么如果此时我们减 1 的话则最高位会降一位其余为 0 的位现在都为变为 1那么我们把两数相与就会得到 0
比如 2 3 次方为 8二进制位 1000 那么 ` 8 - 1 = 7`其中 7 的二进制位 0111
### 图片描述
2019-11-14 11:00:28 +08:00
![](https://blog-1257126549.cos.ap-guangzhou.myqcloud.com/blog/1w9lq.jpg)
2019-05-13 09:08:48 +08:00
### 代码实现
利用这个性质只需一行代码就可以搞定
```c++
class Solution {
public:
bool isPowerOfTwo(int n) {
return (n > 0) && (!(n & (n - 1)));
}
};
```
2019-11-14 11:00:28 +08:00
![](https://blog-1257126549.cos.ap-guangzhou.myqcloud.com/blog/guem9.png)