【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
;
}
};