给定一个整数,写一个函数来判断它是否是3的幂次方。如果是,返回true;否则,返回false。整数n是3的幂次方需满足:存在整数x使得n==3^x。
输入:n==27
输出:true
输入:n==0
输出:false
输入:n==9
输出:true
解法一:试除法
我们不断的将n除以3,直到n等于1。如果此过程中n无法被3整除,就说明n不是3的幂。本题中的n可以为负数或零,可以直接提前判断该情况并返回false,也可以进行试除,因为负数或零无法通过多次除3得到1。
bool isPowerOfThree(int n){
while (n&&n%3==0)
{
n/=3;
}
if (n==1)
{
return true;
}
else
return false;
}
时间复杂度:O(logn)
空间复杂度:O(1)
解法二:公约法
据题可知,n在有符号32位整数范围内【-2^31,2^31-1】,最大3幂为3^19=1162261467,我们只需要判断n是否是1162261467的约数即可。这里需要判断n是负数或0时直接返回false。
bool isPowerOfThree(int n){
if ((n>0)&&(1162261467%n==0))
{
return true;
}
return false;
}
时间复杂度:O(1)
空间复杂度:O(1)
解法三:递归
n为3的幂需要满足两个条件:1.n是正整数;2.n是3的倍数。
任何一个数的0次方都是1,所以在n==1的情况下也是3的幂,而在n为3的倍数时,就可以进行自己调用自己的操作了。
bool isPowerOfThree(int n){
if (n<0)
{
return false;
}
else if (n==1)
{
return true;
}
else if (n%3==0)
{
return isPowerOfThree(n/3);
}
else
return false;
}
时间复杂度:O(logn)
空间复杂度:O(1)