mirror of
https://gitee.com/TheAlgorithms/LeetCodeAnimation.git
synced 2024-12-06 15:19:44 +08:00
84 lines
2.0 KiB
Java
84 lines
2.0 KiB
Java
# 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)
|