326. Power of Three

原题链接:https://leetcode.com/problems/power-of-three/description/
实现如下:

/**
 * Created by clearbug on 2018/2/26.
 */
public class Solution {

    public static void main(String[] args) {
        Solution s = new Solution();
        System.out.println(s.isPowerOfThree(13));
        System.out.println(s.isPowerOfThree(6561));
    }

    /**
     * 官方解答四:利用了整数的上限
     *
     * Submission Detail: 64.78%
     * Runtime: 71 ms
     *
     * 时间复杂度:O(1)
     * 空间复杂度:O(1)
     *
     * @param n
     * @return
     */
    public boolean isPowerOfThree(int n) {
        return n > 0 && 1162261467 % n == 0;
    }

    // 官方解答三:使用了数学上的公式,并且还要处理编程语言中的误差。这个方法我没看太懂,这里就不说了

    /**
     * 官方解答二:使用进制转换
     *
     * Submission Detail: 2.38%
     * Runtime: 133 ms
     *
     * 时间复杂度:O(log3n), 这个取决于 Integer.toString 方法的内部实现啦
     * 空间复杂度:O(log3n)
     *
     * @param n
     * @return
     */
    public boolean isPowerOfThree3(int n) {
        if (n < 1) {
            return false;
        }

        return Integer.toString(n, 3).matches("^10*$");
    }

    /**
     * 官方解答一:直接使用循环取余、做除法来解决的,很显然这种方法效率不高,并且题目中提到了不要用循环了
     *
     * Submission Detail: 61.85%
     * Runtime: 73 ms
     *
     * 时间复杂度:O(log3n)
     * 空间复杂度:O(1)
     *
     * @param n
     * @return
     */
    public boolean isPowerOfThree2(int n) {
        if (n < 1) {
            return false;
        }

        while (n % 3 == 0) {
            n = n / 3;
        }

        return n == 1;
    }

    /**
     * 1, 3, 9, 27, 81, 243, 729, 2187, 6516... 我以为我已经发现了这个问题的诀窍所在了,谁知我却是大错特错的!比如 21 就直接把我的
     * 解法摧垮了!无奈了,只能去看官方解答了。。。
     *
     * @param n
     * @return
     */
    public boolean isPowerOfThree1(int n) {
        int module = n % 10;
        return (module == 1 || module == 3 || module == 9 || module == 7)
                && n % 3 == 0;
    }

}
posted @ 2018-04-08 19:45  optor  阅读(124)  评论(0编辑  收藏  举报