判断一个数是否为2的整数次幂

LeetCode——第231题:2的幂

1.题目与示例描述

题目:

​ 给定一个整数,编写一个函数来判断它是否是 2 的幂次方。

示例 1:

	输入:1

	输出:true

	解释:2 = 1^{0}

示例 2:

	输入:218

	输出:false

2.解题思路与题解

解题思路1(普通遍历):

​ 利用一个整型变量temp,从1开始乘以2,每次乘完的结果和目标整数相比,若temp小于目标整数则让temp继续乘以2;若temp等于目标整数,则说明目标整数是2的整数次幂,返回true;当temp大于目标整数,则结束,返回false。

  • 题解代码:
 public static boolean isPowerOfTwo(int n) {
        int temp = 1;
        while (temp <= n) {
            if (temp == n) {
                return true;
            }
            temp *= 2;
        }
        return false;
    }
  • **时间复杂度:**O(logN)

解题思路2(位运算):

​ 将2的整数次幂数如2、4、8写成二进制,可以发现第一位都是1,其余n位都是0,而将其减1,将得到第一位是0,其余位都是1,两数进行与运算,若结果为0,则说明输入的n是2的整数次幂,反之不是。

2x n n - 1 n & (n - 1)
20 0001 0000 0
21 0010 0001 0
22 0100 0011 0
23 1000 0111 0
  • 题解代码:
public static boolean isPowerOfTwo2(int n) {
        return n > 0 && (n & (n - 1)) == 0;
    }
  • **时间复杂度:**O(n)

3.完整代码

package power;

public class PowerOfTwo {
    /*需要考虑目标整数为负数的情况*/
    public static void main(String[] args) {
        System.out.println(isPowerOfTwo(-1024));
        System.out.println(isPowerOfTwo(5));
        System.out.println(isPowerOfTwo(256));
    }

    public static boolean isPowerOfTwo(int n) {
        int temp = 1;
        while (temp <= n) {
            if (temp == n) {
                return true;
            }
            temp *= 2;
        }
        return false;
    }

    public static boolean isPowerOfTwo2(int n) {
        return n > 0 && (n & (n - 1)) == 0;
    }
}

posted on 2020-02-18 23:08  JavaCoder567  阅读(1069)  评论(0编辑  收藏  举报

导航