题目
Power of Three
Given an integer, write a function to determine if it is a power of three.
Follow up:
Could you do it without using any loop / recursion?
Credits:
Special thanks to @dietpepsi for adding this problem and creating all test cases.
Subscribe to see which companies asked this question
分析
题目本身是一道easy的题目,但是有要求不用循环和递归这个就有些麻烦了。
思路一
不能用循环和递归那么就从3的幂的几个数之间寻找联系,于是列了几个数(3,9,27)观察了一阵,并没有结论,(pass)
思路二
既然数都列出来了那么就一个个比较就是了,思路比较粗暴就直接列代码了
bool isPowerOfThree(int n) {
switch(n)
{
case 1:return true;
case 3:return true;
case 9:return true;
case 27:return true;
case 81:return true;
case 243:return true;
case 729:return true;
case 2187:return true;
case 6561:return true;
case 19683:return true;
case 59049:return true;
case 177147:return true;
case 531441:return true;
case 1594323:return true;
case 4782969:return true;
case 14348907:return true;
case 43046721:return true;
case 129140163:return true;
case 387420489:return true;
case 1162261467:return true;
case 3486784401:return true;//int范围内最大的是3^19
default: return false;
}
}
但是提交的结果要140ms。
思路三
思路二中对每个数字的判断只进行了20次左右的比较运算,但是在结果排名比较靠后。所以在思考许久未果之后,又浏览了讨论区,有了新方法。
bool isPowerOfThree(int n) {
return n>0 && !(1162261467 % n) ;
}
//if(n是3的幂)那么 3^19 % n == 0
但是即使是这样,最后排名也只有69%。还有一种思路就是log3(n),取3的对数。但是这样感觉并不会比思路三更快。
后续
参考了官方给出的解答,方法应该是没错的,可能是leetcode运行时的问题导致某些提交的运行时间更短。