【LeetCode & 剑指offer刷题】发散思维题6:231. Power of Two(系列)
【LeetCode & 剑指offer 刷题笔记】目录(持续更新中...)
231. Power of Two
Given an integer, write a function to determine if it is a power of two.
Example 1:
Input: 1
Output: true
Example 2:
Input: 16
Output: true
Example 3:
Input: 218
Output: false
//判断一个整数是否为2的幂(说明必为正数)
class Solution
{
public:
bool isPowerOfTwo(int n)
{
if(n<=0) return false; //特殊情况判断
// cout << ((n-1)&n) << endl;
if( ((n-1)&n) == 0 )
{
return true;//若为2的幂,则二进制表示中只有一个1,减一做与运算之后就会变为0
}
else return false;
//直接换成 return ((n-1)&n) == 0;可以使代码更紧凑
}
};
326. Power of Three
Given an integer, write a function to determine if it is a power of three.
Example 1:
Input: 27
Output: true
Example 2:
Input: 0
Output: false
Example 3:
Input: 9
Output: true
Example 4:
Input: 45
Output: false
Follow up:
Could you do it without using any loop / recursion?
//循环法
/*
class Solution
{
public:
bool isPowerOfThree(int n)
{
if(n<1) return false;
while(n%3 == 0) n /= 3; //多次除以3
return n == 1; //如果最后商为1,则说明为3的幂
}
};*/
/*取对数法
n=3^i i=log3(n)
i=logb(n)/logb(3) 看i是否为整数(除以1看是否余数为0)
,这里选择10为底(没有问题,不过不明白为什么不存在舍入误差),若选择自然对数,则需考虑舍入误差
*/
#include <cmath>
class Solution
{
public:
bool isPowerOfThree(int n)
{
return fmod(log10(n)/log10(3), 1) == 0; //fmod为计算除法运算 x/y 的浮点余数
}
};
java:return (Math.log(n) / Math.log(3) + epsilon) % 1 <= 2 * epsilon;
342. Power of Four
Given an integer (signed 32 bits), write a function to check whether it is a power of 4.
Example:
Given num = 16, return true. Given num = 5, return false.
Follow up: Could you solve it without loops/recursion?
Credits:
/*
先判断是否为2的幂,再判断是否满足(num-1)为3的倍数(必要条件,不过不知道两个组合起来可不可以称为充分条件)
We know from Binomial Theroem that (1+X)^n = C(n,0) + C(n,1)*X + C(n,2)*X^2 + C(n,3)*X^3 +.........+ C(n,n)*X^n
Put X=3, we get 4^n = 1 + C(n,1)*3 + C(n,2)*3^2 + C(n,3)*3^3 +.........+ C(n,n)*3^n
by moving 1 left side, we get 4^n - 1 = C(n,1)*3 + C(n,2)*3^2 + C(n,3)*3^3 +.........+ C(n,n)*3^n
i.e (4^n - 1) = 3 * [ C(n,1) + C(n,2)*3 + C(n,3)*3^2 +.........+ C(n,n)*3^(n-1) ]
This implies that (4^n - 1) is multiple of 3.
*/
class Solution
{
public:
bool isPowerOfFour(int num)
{
if(num<=0) return false;
return ((num-1)&num) == 0 && (num-1)%3 == 0;
}
};