刷题笔记-231. 2 的幂

94 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第12天,点击查看活动详情

一、题目描述:

231. 2 的幂 - 力扣(LeetCode)

给你一个整数 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为2的幂,则一定满足以下条件:

恒有n & n(n - 1) == 0,原因如下:

  • n 二进制最高位为1,其余所有位为0;
  • n - 1 二进制最高位为0,其余所有位为1;

所以通过

n > 0 && (n & (n-1)) == 0可以判断是否满足n为2的幂

三、AC 代码:

var isPowerOfTwo = function(n) {
    return n > 0 && (n & (n - 1)) === 0;
};

四、总结:

本题虽然有其他取巧的解法,但是重点的还是这个位运算,这个直接想可能有点困难,需要我们自己去实践下,如果不是太会的话,可以参考下题解区,好多大佬都是给了动图,表格什么的,非常详细。

五、参考:

位运算的常用技巧:lowbit运算,包含lowbit公式、讲解、证明 - 2 的幂 - 力扣(LeetCode)

执行结果: 通过 显示详情 添加备注 执行用时:0 ms, 在所有 C 提交中击败了100.00% 的用户 内存消耗:5.2 MB, 在所有 C 提交中击败了99.92% 的用户 通过测试用例:1108 / 1108 - 2 的幂 - 力扣(LeetCode)

自己写的python 递归解法,小白选手,思路应该可以简化,有高手指点下吗 - 2 的幂 - 力扣(LeetCode)