231. Power of Two

问题:
Given an integer, write a function to determine if it is a power of two.

我的解答:

class Solution {
public:
    bool isPowerOfTwo(int n) {

    if (n<=0) return false;

int num = pow(2,(int)(log2(INT_MAX)));
    double a =fmod(num,n);
    if (a > 0) return false;
    else return true;
    }
};

8ms
解释:
拿到这道题,首先想到的是按照power of three 的做法。就是先找出2的幂的最大值,然后对该数取余,若是有余数的话,那么就不是2的幂。不过这里可以判断是否为非1的奇数,若是奇数那么最右边一位必定为1。不过我试过了,也没有加快,还是8ms。

不过,是不是有更好的办法呢?

那么我不用最大的求,我就用log2(n)这个公式来求假如n是2的幂的话,那么返回的是整数,否则返回的是有小数部分的。

class Solution {
public:
    bool isPowerOfTwo(int n) {
        if(n<=0) return false;
        double a=log2(n);
        double t=a-(int)a;
        if(t>0) return false;
        else return true;
    }
};

4ms。beats 90.35% !!

brilliant!!

写到这里又想到,那为什么做power of three 这道题时使用的是log10(n)/log10(3)呢,而不用log3(n)?尝试了一下,发现根本就没有log3()这个函数,只能使用log10或者log2. 所以只能用log10(n)/log10(3),因为在数学上这个通过换底公式与log3(n)是等价的。

这种做法很好很快,那么有没有别的做法呢。后来发现了一种做法,虽然速度没有那那么快,但是想法很好。速度是8ms。想法是,所有的2的幂转换成二进制,都只有一个”1“别的都是”0“,那么通过n&(n-1)看看是不是只有一个“1”,就知道了。

class Solution {
public:
    bool isPowerOfTwo(int n) {
         return (n>0&&((n&(n-1))==0));
    }


};

8ms

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值