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

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

给定一个整数n,写一个函数来判断它是否是 4 的幂次方。如果是,返回 true ;否则,返回 false

方法一:

我们最容易想到的解题方式就是不断地除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
};

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值