注意:凡是以英文出現(xiàn)的囊扳,都是題目提供的,包括答案代碼里的前幾行扛门。
題目:
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,看最后的余數(shù)是否為0。(循環(huán)或者遞歸)
但是后面有一個附加的條件:能否不用循環(huán)或者遞歸來解決問題悔醋??
參考了一些文章囤耳,文章鏈接
答案一:
利用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);
}
答案二:
利用數(shù)學(xué)函數(shù)偶芍。 如果用自然底數(shù)e
,logRes = log(n) / log(3)
當輸入是243時德玫,結(jié)果錯誤匪蟀。下面是原因:
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)
,出于同樣的原因宰僧,要考慮小數(shù)的誤差材彪,因此用(logRes - (int)logRes) == 0
來判斷最終的結(jié)果。
class Solution {
public:
bool isPowerOfThree(int n) {
double logRes = log10(n) / log10(3);
return (logRes - (int)logRes) == 0 ? true : false;
}
};
答案三:
窮舉所有的值琴儿。非常暴力6位!造成!思路很贊显熏,因為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);
}