算法笔记 -- 231. 2 的幂

112 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情

一、题目描述:

231. 2 的幂 - 力扣(LeetCode) (leetcode-cn.com)

给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false

如果存在一个整数 x 使得 n == 2x ,则认为 n2 的幂次方。

 

示例 1:

输入:n = 1
输出:true
解释:20 = 1

示例 2:

输入:n = 16
输出:true
解释:24 = 16

示例 3:

输入:n = 3
输出:false

示例 4:

输入:n = 4
输出:true

示例 5:

输入:n = 5
输出:false

提示:

  • -2^31 <= n <= 2^31 - 1

二、思路分析:

打表

这种方法也比较简单和直接,要判断是不是 n 的幂,由于 int 是有范围的,所以最终的结果其实也是固定的一些数,那么我们提前找出这些数判断即可。

打表也是判断 n 的幂的通用解法之一,虽然看上去似乎太?,但是实际上这种方法在我们真正写项目过程中反而常用一些。

当然,我们也可以不打表,而是直接计算出对应的值,然后判断是否相等也行。显然打表的时间复杂度位 O(1).

三、AC 代码:

class Solution {
public:
    bool isPowerOfTwo(int n) {
        switch (n) {
            case 1:
            case 2:
            case 4:
            case 8:
            case 16:
            case 32:
            case 64:
            case 128:
            case 256:
            case 512:
            case 1024:
            case 2048:
            case 4096:
            case 8192:
            case 16384:
            case 32768:
            case 65536:
            case 131072:
            case 262144:
            case 524288:
            case 1048576:
            case 2097152:
            case 4194304:
            case 8388608:
            case 16777216:
            case 33554432:
            case 67108864:
            case 134217728:
            case 268435456:
            case 536870912:
            case 1073741824:
                return true;     
            default:
                return false;
        }
    }
};

四、总结:

高级的还有二进制解法,简单说下原理

2 的幂其实就是只有一个 1 的二进制数,因此,我们可以利用这一点来判断,如果只有一个 1,那么就是 2 的幂。

而判断是否只有一个 1,也有两种方法:

  1. 我们清除这个 1,如果结果是 0,那么就满足
  2. 获取 1 的位置,如果和原数相同,那么也满足

范文参考

2的幂,转化为2进制,在计1的数 - 2 的幂 - 力扣(LeetCode)