最近在看一些算法,打算写一些博客把这些巧妙的算法记录下来,分享给大家
题目:判断一个正整数是否是2的整数次幂
解法一:设置一个中间变量初始值为1,将输入的正整数不断和初始值比较,如果初始值小于输入的整数,就乘2再比较,直到后面相等返回true或者大于输入的整数返回false。
举个例子:输入13,1*2=2,2*2=4,4*2=8,8*2=16,16>13,所以返回false,该算法的时间复杂度为O(logn)。
public static boolean isPowerOf2(int num)
{
int temp = 1;
while(temp<=num)
{
if(temp==num)
{
return true;
}
temp = temp*2;
}
return false;
}
解法2:c语言中向左移位表示乘以2,但比单纯的乘法效率高,改进之后代码如下,但时间复杂度还是O(logn)。
public static boolean isPowerOf2(int num)
{
int temp = 1;
while(temp<=num)
{
if(temp==num)
{
return true;
}
temp = temp<<1;
}
return false;
}
解法3:利用二进制数字特点,将整数转为二进制之后与其-1后的二进制按位与运算。
比如8的二进制为1000,-1之后的二进制为111,16的二进制为10000,-1之后为1111,32的二进制为100000,-1之后为11111,可以看到如果一个数为2的整数次幂,将它本身的2进制数和它本身-1之后的二进制数按位与运算的话结果为0,如果不是2的整数次幂的整数,进行上述运算,结果一定不为0。
public static boolean isPowerOf2(int num)
{
return(num&num-1)==0;
}
这种方法的时间复杂度只有O(1)。