「前端刷题」231.2 的幂(EASY)

96 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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;
    }
}