leetcode-326-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(成功,22ms,很快)
用递归的方法,不断除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-2 ^ 31,在此范围中允许的最大的3的次方数为3 ^ 19=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);
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值