LeetCodeAnimation/notes/LeetCode第231号问题:2的幂.md
程序员吴师兄 5dee53d957 更换图片地址
2019-11-14 11:00:28 +08:00

84 lines
2.0 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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
```
**示例 2:**
```
输入: 16
输出: true
解释: 2^4 = 16
```
**示例 3:**
```
输入: 218
输出: false
```
### 题目解析
首先先来分析一下 2 的次方数的二进制写法
![表格](https://blog-1257126549.cos.ap-guangzhou.myqcloud.com/blog/3wdpd.jpg)
仔细观察可以看出 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
### 图片描述
![](https://blog-1257126549.cos.ap-guangzhou.myqcloud.com/blog/1w9lq.jpg)
### 代码实现
利用这个性质只需一行代码就可以搞定
```c++
class Solution {
public:
bool isPowerOfTwo(int n) {
return (n > 0) && (!(n & (n - 1)));
}
};
```
![](https://blog-1257126549.cos.ap-guangzhou.myqcloud.com/blog/guem9.png)