while循环解法
class Solution {
public:
bool isPowerOfThree(int n) {
while(n > 1)
{
if(n % 3 != 0)
return false;
n /= 3;
}
return (n == 1) ? true:false;
}
};
循环解法更优解法:
class Solution {
public:
bool isPowerOfThree(int n) {
if(n < 1)
return false;
while(n % 3 == 0)
{
n /= 3;
}
return 1 == n;
}
};
和第一种方法对比,这种方法运行效率更高。原因是把n > 1放在了循环外面(确实也只用判断一次)。
recursion递归解法
class Solution {
public:
bool isPowerOfThree(int n) {
if(n == 1)
return true;
if(n % 3 == 0 && n > 0)
return isPowerOfThree(n/3);
else
return false;
}
};
精炼的递归写法:
class Solution {
public:
bool isPowerOfThree(int n) {
return n > 0 && (n == 1 || (n % 3 == 0) && isPowerOfThree(n / 3));
}
};
不使用while和递归的解法:
这种解法先找到3的n次方的最大值,然后最大值对n取余等于0则证明n是3的n次方。
class Solution {
public:
int const Max3PowerInt = 1162261467; // 3^19, 3^20 = 3486784401 > MaxInt32
int const MaxInt32 = 2147483647; // 2^31 - 1
bool isPowerOfThree(int n) {
if (n <= 0 || n > Max3PowerInt)
return false;
return Max3PowerInt % n == 0;
}
};
不使用循环和递归的另一种解法:
class Solution {
public:
bool isPowerOfThree(int n) {
return fmod(log10(n)/log10(3), 1) == 0;
}
};
这种解法是利用对数去底数性质,返回余数(对1取余,观察是否有小树)