注意:凡是以英文出现的,都是题目提供的,包括答案代码里的前几行。
题目:
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?
解析:
这一题最开始的想法就是每次都除以3,看最后的余数是否为0。(循环或者递归)
但是后面有一个附加的条件:能否不用循环或者递归来解决问题??
参考了一些文章,文章链接
答案一:
利用int型的最大值范围在319到320之间,来取余(Java)
public class Solution {
public boolean isPowerOfThree(int n) {
// 1162261467 is 3^19, 3^20 is bigger than int
return ( n>0 && 1162261467%n==0);
}
答案二:
利用数学函数。 如果用自然底数e
,logRes = log(n) / log(3)
当输入是243时,结果错误。下面是原因:
log(243) = 5.493061443340548 log(3) = 1.0986122886681098
==> log(243)/log(3) = 4.999999999999999
log10(243) = 2.385606273598312 log10(3) = 0.47712125471966244
==> log10(243)/log10(3) = 5.0
因此只能使用log10(n) / log10(3)
,出于同样的原因,要考虑小数的误差,因此用(logRes - (int)logRes) == 0
来判断最终的结果。
class Solution {
public:
bool isPowerOfThree(int n) {
double logRes = log10(n) / log10(3);
return (logRes - (int)logRes) == 0 ? true : false;
}
};
答案三:
穷举所有的值。非常暴力!!!思路很赞,因为int型表示的值有限
public boolean isPowerOfThree(int n) {
HashSet<Integer> set = new HashSet<>(Arrays.asList(1, 3, 9, 27, 81, 243, 729, 2187, 6561, 19683, 59049, 177147, 531441, 1594323, 4782969, 14348907, 43046721, 129140163, 387420489, 1162261467));
return set.contains(n);
}