跳至主要內容

0231. 2 的幂

ITCharge大约 1 分钟

0231. 2 的幂open in new window

  • 标签:位运算、递归、数学
  • 难度:简单

题目链接

题目大意

描述:给定一个整数 nn

要求:判断该整数 nn 是否是 22 的幂次方。如果是,返回 True;否则,返回 False

说明

  • 231n2311-2^{31} \le n \le 2^{31} - 1

示例

  • 示例 1:
输入:n = 1
输出:True
解释:2^0 = 1
  • 示例 2:
输入:n = 16
输出:True
解释:2^4 = 16

解题思路

思路 1:循环判断

  1. 不断判断 nn 是否能整除 22
    1. 如果不能整除,则返回 False
    2. 如果能整除,则让 nn 整除 22,直到 n<2n < 2
  2. 如果最后 n==1n == 1,则返回 True,否则则返回 False

思路 1:代码

class Solution:
    def isPowerOfTwo(self, n: int) -> bool:
        if n <= 0:
            return False

        while n % 2 == 0:
            n //= 2
        return n == 1

思路 1:复杂度分析

  • 时间复杂度O(log2n)O(\log_2 n)
  • 空间复杂度O(1)O(1)

思路 2:数论判断

因为 nn 能取的最大值为 23112^{31}-1。我们可以计算出:在 nn 的范围内,22 的幂次方最大为 230=10737418242^{30} = 1073741824

因为 22 为质数,则 2302^{30} 的除数只有 20,21,,2302^0, 2^1, …, 2^{30}。所以如果 nn22 的幂次方,则 2302^{30} 肯定能被 nn 整除,直接判断即可。

思路 2:代码

class Solution:
    def isPowerOfTwo(self, n: int) -> bool:
        return n > 0 and 1073741824 % n == 0

思路 2:复杂度分析

  • 时间复杂度O(1)O(1)
  • 空间复杂度O(1)O(1)