leetcode326(3的幂)

题目如下

给定一个整数,写一个函数来判断它是否是 3 的幂次方。

示例 1:

输入: 27
输出: true
示例 2:

输入: 0
输出: false
示例 3:

输入: 9
输出: true
示例 4:

输入: 45
输出: false
进阶:
你能不使用循环或者递归来完成本题吗?

最简单解法当然是O(n)O(n),直接使用顺序遍历查找,就不写代码了。
重点关注的是如何找出O(1)O(1)的算法,代码如下
就是假设xlog(3)=log(n)xlog(3)=log(n),解出x就可以了,但是需要注意的是java里面的精度,Java使用log之后会有精度损失,比如n为243的时候,x的解是4.9999999,而不是5,于是我们需要对答案精度一定程度的处理,相当于当x非常接近一个整数的时候,就判断他是我们需要的解。

class Solution {
    private static final  double epsion = 10e-15;
    public boolean isPowerOfThree(int n) {
     	double res = Math.log(n)/Math.log(3);
        //floor返回不大于的最大整数,ceil返回不小于的最大整数
        return Math.abs(res - Math.round(res)) < epsion;
    }
}
posted @ 2019-05-10 16:13  ayang818  阅读(140)  评论(0编辑  收藏  举报