1. 程式人生 > >leetcode-32-3的冪(power of three)-java

leetcode-32-3的冪(power of three)-java

題目及測試

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);
    }
};