0
点赞
收藏
分享

微信扫一扫

算法题 | 判断一个数是不是4的幂(JS)

年迈的代码机器 2022-01-17 阅读 47

算法题 | 判断一个数是不是4的幂(JS)

方法一:

我们最容易想到的解题方式就是不断地除4,只要中间有一步4无法被整除,它就不是4的幂。如果这个整数除到最后是1,说明它是4的幂。

/**
 * @param {number} n
 * @return {boolean}
 */
var isPowerOfFour = function(n) {
    if(n==0){
        return false
    }
    while(n%4==0){
        n=n/4
    }
    return n==1
};

方法二:

方法一还可以写成递归的形式:

/**
 * @param {number} n
 * @return {boolean}
 */
var isPowerOfFour = function(n) {
    return n>0 && (n==1||(n%4==0&&isPowerOfFour(n/4)))
};

方法三:

4的幂为,4、16、64…这样的数。他们的二进制数为100100001000000这样的形式,我们可以发现第一位为1,其它位都为0,且0的个数是偶数个。

  1. 判断一个数只有最高位是1: (n&(n-1)) == 0
  2. 判断一个数其它偶数个数都是0 => 这个数的1出现在偶数二进制位上(10000的1在第4位)=> 这个数和10101010101010101010101010101010的与,必然为0: (n&0xAAAAAAAA ) == 0
/**
 * @param {number} n
 * @return {boolean}
 */
var isPowerOfFour = function(n) {
    return n>0 && (n&(n-1))==0 && (n&0xAAAAAAAA)==0
};

方法四:

通过方法二中找到的规律,我们还可以通过正则表达式来检测。

/**
 * @param {number} n
 * @return {boolean}
 */
var isPowerOfFour = function(n) {
    const nstr = n.toString(2)
    return /^1(00)*$/.test(nstr)
};

方法五:

4的幂一定是2的幂,这个数的最高位一定是1。其次,4的幂对3取模是1,4%3=1,8%3=2,16%3=1...,所以对方法二可以再改一下。

/**
 * @param {number} n
 * @return {boolean}
 */
var isPowerOfFour = function(n) {
    return n>0 && (n&(n-1))==0 && n%3==1
};

方法六:

n如果是4的幂,说明 根号n一定是2的幂。判断2的幂可以通过(n&(n-1))==0(n&(-n))==n两种方式判断,所以也有两种写法。

/**
 * @param {number} n
 * @return {boolean}
 */
var isPowerOfFour = function(n) {
    if(n<=0){
        return false
    }
    let sqrtn = Math.floor(Math.sqrt(n)) 
    return sqrtn*sqrtn==n && (sqrtn&(sqrtn-1))==0
};
/**
 * @param {number} n
 * @return {boolean}
 */
var isPowerOfFour = function(n) {
    if(n<=0){
        return false
    }
    let sqrtn = Math.floor(Math.sqrt(n)) 
    return sqrtn*sqrtn==n && (sqrtn&(-sqrtn))==sqrtn
};

举报

相关推荐

0 条评论