前言
我先在在这里吐槽以下JavaApi的对数计算机制,差点把我整傻眼了,要想知道为啥,接着看下去叭。许久没更新我的每日一题博客了,主要是前几天中秋白天玩去了,每次做完都很晚了,但是几乎都还是打卡了
打卡界面
原题题目
给定一个整数,写一个函数来判断它是否是 3 的幂次方。如果是,返回 true ;否则,返回 false 。
整数 n 是 3 的幂次方需满足:存在整数 x 使得 n == 3x
题目案例
題目分析
今日的题目看起来就很简单,就是判断一个数是否是三的x次方,是的很简单,但是我看进阶要求里面有一个不适用递归和循环,我一想不就用对数就可以搞定吗?可以不用循环,嗯开造!
代码展示
方法一:不用递归和循环
class Solution {
public boolean isPowerOfThree(int n) {
if( n==0){
return false;
}
DecimalFormat df = new DecimalFormat("##########.0000000000000");
double s = Math.log(n)/Math.log(3);
s = Double.parseDouble(df.format(s));
//System.out.println(s);
s = s%1;
if(s==0.000 || s==0.999){
return true;
}
return false;
}
}
本方法采用的思路,是用对数来求,看n对三取对数是否位一个整数来判断是否是三的幂,但这里很多不必要的代码,比如df对数据格式后保留几位小数,为什么s==0.999,这都是Math函数的漏洞,因为没有直接可以写log以3为底数的方法,就只能用Math.log(n)/Math.log(3)做除法,而过程中却因为,自东给我讲243= 3^(5)结果算成了4.99999,我迷路了 ,反正最后经过我的各种调试,得到了最后的运行通过,但效果差强人意。
LeetCode运行截图:
在这样子的条件下,我还是选择了循环的方法,又简单,又暴力
方法二:while循环
在n!=0的情况下,只要是3的倍数就继续除以3,直到不能除下去了,判断这个值是否为1,就是我方法二的思路。
public boolean isPowerOfThree(int n) {
while (n!=0 && n%3==0){
n/=3;
}
return n==1;
}
LeetCode运行截图:
ps:每日一句毒鸡汤:努力工作不一定能提前转正,但是划水一定会很轻松。