2 的幂(Leetcode原题)

给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。

2 的幂

如果存在一个整数 x 使得 n == 2x ,则认为 n 是 2 的幂次方。

这个其实在熟悉不过了,这就是2的平方嘛,算哪些数是二的平方.

那不是很简单嘛,直接一个循环,加一个pow函数搞定!

bool isPowerOfTwo(int n)
{
    if(n==1)
    {
        return 1;
    }

    for(int i=1;i<=n;i++)
    {
        if(pow(2,i)==n)
        {
            return true;
        }
    }

    return false;
}

走你!
在这里插入图片描述

然而leetcode不可能就这么放你过去,他就给你出这些实例.

那么只好再想一想,换一种思路

如果把二的平方数的二进制写出来,会不会好办呢?

1-00000001,2-00000010,4-00000100,8-00001000,16-00010000…

哎,突然发现,好像所有二的平方的二进制都只有一个1哎,那么任务就从算2 的幂到看那个数的二进制有多少个1了.

那如果把二进制一一拆出来放到数组里,然后判断数组中包含1的个数,如果是1个1,那么不就是我们要找的2 的幂吗!卧槽,干!

bool isPowerOfTwo(int n)
{
	int arr[100];
    int count=0,i=0;
	//将二进制一一拆出放到数组里
    while(n)
    {
        arr[i]=n%2;
        i++;
        n/=2;
    }
    //如果数组中有一个1,就使计数变量加1
    for(int j=0;j<i;j++)
    {
        if(arr[j]==1)
        {
            count++;
        }
    }
	
    if(count==1)
    {
        return true;
    }
    else
    {
        return false;
    }
}

在这里插入图片描述

我靠,高分通过,牛逼!那这时已经大功告成了.还需要什么操作呢?

再想想,好像位运算这个东西还能优化一下这个代码哎,既然我们之前知道n&(n-1)能够减少掉1位1
例如:1100&1011=1000,那么直接这样一段代码,不就又行了

bool isPowerOfTwo(int n)
{
    
    if((n&(n-1))==0)
    {
        return true;
    }       
    return false;

}

**加粗样式**
哦,原来没注意有这种测试用例,那么我们应该杜绝这些特殊用例的出现,因为2 的幂不可能是负数嘛.所以再加上一句判断

	if(n<=0)
    {
        return false;
    }

在这里插入图片描述

通过,不过看上去好像优化了个寂寞,实际上是减少了很多不必要的步骤的

整体代码

bool isPowerOfTwo(int n)
{
    if(n<=0)
    {
        return false;
    }
    if((n&(n-1))==0)
    {
        return true;
    }       
    return false;

}

结束,这里选用了三种较为好理解的方法来做这个题,如有不足,还望指正!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值