题目

给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。如果存在一个整数 x 使得 n== 2^x,则认为 n 是 2 的幂次方。
https://leetcode.cn/problems/power-of-two/description/

解题思路

如果一个数是2的幂次方,那么这个整数肯定满足两个条件:
  1. 大于0
  2. 二进制表达中,有且只有1个位置为1。
n 制表达 
2^0 == 1 0000 0001
2^1 == 2 0000 0010
2^2 == 4  0000 0100
2^3 == 8 0000 1000
...  ... 
2^n 第n位为1,其他均为0。n从0开始。

解法一:获取二进制最低位

我们首选可以排除 <=0 的整数,然后可以使用获取二进制最低位的方式去判断 >0 的整数,我们知道获取最低位的方法是  n & (-n) ,因为要求n只能包含一个1,所以势必 n = n & (-n)

n -n n & (-n)
0000 0001 1111 1111
0000 0001
0000 0010 1111 1110
0000 0010
0000 0100 1111 1100  0000 0100
0000 1000 1111 1000  0000 1000
0001 0000 1111 0000
0001 0000
...... ...... ......

代码实现

class Solution {
    public boolean isPowerOfTwo(int n) {
        if(n <= 0){
            return false;
        }
        // 只有一个位为1,所有lowbit 应该等于n本身
        return (n & -n) == n;
    }}

复杂度分析

时间复杂度: O(1)。
空间复杂度: O(1)。
 

解法二:删除最低位

解题思路同解法一,然后我们将获取最低位改为删除最低位,因为n的二进制表示中有且只有1个1,那么删掉最后一个1之后剩下的应该都是0才对,即 (n & (n - 1)) == 0

n n - 1 n & (n - 1)
0000 0001 0000 0000
0000 0000
0000 0010 0000 0001 0000 0000
0000 0100 0000 0011 0000 0000
0000 1000 0000 0111 0000 0000
0001 0000 0000 1111 0000 0000
...... ...... ......

代码实现

class Solution {
    public boolean isPowerOfTwo(int n) {
        if(n <= 0){
            return false;
        }
        return (n & (n - 1)) == 0;
    }}

复杂度分析

时间复杂度: O(1)。
空间复杂度: O(1)。
 

解法三:Integer.bitCount(n)

解题思路还是获取二进制中1的个数,我们可以使用JDK自带方法 Integer.bitCount(n) 去获取1的个数,为1则返回 true,否则返回 false

 

代码实现

class Solution {
    public boolean isPowerOfTwo(int n) {
        if(n <= 0){
            return false;
        }
        return Integer.bitCount(n) == 1 ? true : false;
    }}

复杂度分析

时间复杂度 O(logN):N为二进制位数。复杂度分析参见计算二进制表达式中数字位数为 ‘1’ 的个数

空间复杂度 O(1)。

本篇文章来源于微信公众号: i余数



微信扫描下方的二维码阅读本文

此作者没有提供个人介绍
最后更新于 2023-05-28