leetcode-32-3的冪(power of three)-java
阿新 • • 發佈:2018-11-11
題目及測試
package pid326; /* 3的冪 給定一個整數,寫一個函式來判斷它是否是 3 的冪次方。 示例 1: 輸入: 27 輸出: true 示例 2: 輸入: 0 輸出: false 示例 3: 輸入: 9 輸出: true 示例 4: 輸入: 45 輸出: false 進階: 你能不使用迴圈或者遞迴來完成本題嗎? */ import java.util.List; public class main { public static void main(String[] args) { int [] testTable = {15,9,27}; for (int ito : testTable) { test(ito); } } private static void test(int ito) { Solution solution = new Solution(); boolean rtn; long begin = System.currentTimeMillis(); System.out.print(ito); System.out.println(); //開始時列印陣列 rtn= solution.isPowerOfThree(ito);//執行程式 long end = System.currentTimeMillis(); System.out.println("rtn=" ); System.out.print(rtn); System.out.println(); System.out.println("耗時:" + (end - begin) + "ms"); System.out.println("-------------------"); } }
解法1(成功,85ms,很慢)
用遞迴的方法,不斷除3,再給自身
package pid326; import java.util.Arrays; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map.Entry; public class Solution { public boolean isPowerOfThree(int n) { if(n<=0){ return false; } if(n==1){ return true; } if(n%3!=0){ return false; } return isPowerOfThree(n/3); } }
解法2(成功,87ms,速度很慢)
迴圈除3
public boolean isPowerOfThree(int n) {
if(n<=0){
return false;
}
if(n==1){
return true;
}
while(n!=1){
if(n%3!=0){
return false;
}
n=n/3;
}
return true;
}
解法3(別人的)
題目中的Follow up讓我們不用迴圈,那麼有一個投機取巧的方法,由於輸入是int,正數範圍是0-231,在此範圍中允許的最大的3的次方數為319=1162261467,那麼我們只要看這個數能否被n整除即可,參見程式碼如下:
class Solution {
public:
bool isPowerOfThree(int n) {
return (n > 0 && 1162261467 % n == 0);
}
};
解法4(別人的)
利用對數的換底公式來做,高中學過的換底公式為logab = logcb / logca,那麼如果n是3的倍數,則log3n一定是整數,我們利用換底公式可以寫為log3n = log10n / log103,注意這裡一定要用10為底數,不能用自然數或者2為底數,否則當n=243時會出錯,原因請看這個帖子。現在問題就變成了判斷log10n / log103是否為整數,在c++中判斷數字a是否為整數,我們可以用 a - int(a) == 0 來判斷,參見程式碼如下:
class Solution {
public:
bool isPowerOfThree(int n) {
return (n > 0 && int(log10(n) / log10(3)) - log10(n) / log10(3) == 0);
}
};