问题:
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