power of three java_leetcode-32-3的幂(power of three)-java

版权声明:此文章为许诗宇所写,如需转载,请写下转载文章的地址https://blog.csdn.net/xushiyu1996818/article/details/83071294

题目及测试

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

}

};

阅读更多

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值