携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第30天,点击查看活动详情
题目(Power of Two)
链接:https://leetcode-cn.com/problems/power-of-two
解决数:1782
通过率:50.4%
标签:位运算 递归 数学
相关公司:amazon google adobe
给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。
如果存在一个整数 x 使得 n == 2x ,则认为 n 是 2 的幂次方。
示例 1:
输入: n = 1
输出: true
解释: 20 = 1
示例 2:
输入: n = 16
输出: true
解释: 24 = 16
示例 3:
输入: n = 3
输出: false
示例 4:
输入: n = 4
输出: true
示例 5:
输入: n = 5
输出: false
提示:
-231 <= n <= 231 - 1
进阶: 你能够不使用循环/递归解决此问题吗?
思路
解法一:2的幂数的数字的二进制特点 + 位操作
- 2的幂数的数字的二进制有且只有一个1,其余均是0
- n & (n-1):清零最低位的1
- 合起来 n & (n-1) == 0
/**
* @param {number} n
* @return {boolean}
*/
var isPowerOfTwo = function(n) {
return n > 0 && (n & (n-1)) == 0;
};
解法二:调用函数懒蛋法
/**
* @param {number} n
* @return {boolean}
*/
var isPowerOfTwo = function(n) {
return Number.isInteger(Math.log2(n));
};
解法三:位运算
/**
* @param {number} n
* @return {boolean}
*/
var isPowerOfTwo = function(n) {
return n > 0 && (n & (-n)) == n
};
解法四:取模
/**
* @param {number} n
* @return {boolean}
*/
var isPowerOfTwo = function(n) {
while(n > 1){
n /= 2;
}
if(n == 1){
return true;
}else{
return false;
}
};
解法五:二进制
- 思路:一个数是2的幂需要满足这个数的二进制中只有一个1,也就是需要满足这个数>0,同时消除唯一的一个1之后就是0
- 复杂度:时间复杂度
O(1)。空间复杂度O(1)
Js:
var isPowerOfTwo = function(n) {
return n > 0 && (n & (n - 1)) === 0;
};
Java:
class Solution {
public boolean isPowerOfTwo(int n) {
return n > 0 && (n & (n - 1)) == 0;
}
}
解法六:是否为最大 2的幂的约数
- 思路:最大的2的幂为
2^30 = 1073741824, 判断 n 是否是2^30的约数即可。 - 复杂度:时间复杂度
O(1)。空间复杂度O(1)
js:
var isPowerOfTwo = function(n) {
const MAX = 1 << 30;
return n > 0 && MAX % n === 0;
};
Java:
class Solution {
static final int MAX = 1 << 30;
public boolean isPowerOfTwo(int n) {
return n > 0 && MAX % n == 0;
}
}