LeetCode.326 3的幂

345 阅读1分钟

这是我参与8月更文挑战的第19天,活动详情查看:8月更文挑战

题目描述:

326. 3的幂 - 力扣(LeetCode) (leetcode-cn.com)

给定一个 整数,写一个函数来判断它是否是 3 的幂次方。如果是,返回 true ;否则,返回 false

整数 n3 的幂次方需满足:存在整数 x 使得 n==3xn == 3^x

示例 1:

输入:n = 27
输出:true

示例 2:

输入:n = 0
输出:false

示例 3:

输入:n = 9
输出:true

示例 4:

输入:n = 45
输出:false

提示

  • 231<=n<=2311-2^{31} <= n <= 2^{31} - 1

思路分析

数学法

n=3xn=3^x  即 n = 3 * 3 * 3 * ... * 3

所以 n 如果是 3 的幂 ,那么 n 一直除以 3 ,最后一定等于 1

AC代码

class Solution {
    fun isPowerOfThree(n: Int): Boolean {
        if (n < 1) {
            return false
        }

        var sum=n
        while(sum%3==0) {
            sum/=3
        }
        return sum == 1
    }
}

递归

这也没什么好说的,很容易就想到了 - -

AC代码

class Solution {
    fun isPowerOfThree(n: Int): Boolean {
        if(n == 0) return false
        if(n == 1) return true

        return if(n % 3 == 0 ) isPowerOfThree(n / 3) else false;

    }
}

硬编码

这。。。int范围内的3的幂才19个,果断硬编码,效率还快

代码就不上了吧。

换底公式

n=3x n=3^x x= log3nx= log3 nx=log103log10nx=\frac{log_{10} 3}{log_{10} n}

n3 的幂,那么 log3nlog_3 n 一定是个整数,由换底公式可以的得到 x=log103log10nx=\frac{log_{10} 3}{log_{10} n} ,只需要判断 log3nlog_3 n 是不是整数即可。

同理该公式可以推广到 n 的幂。

AC代码

class Solution {
    fun isPowerOfThree(n: Int): Boolean {
        
       //k的幂
        val k = 3
        val a = Math.round(Math.log(n.toDouble()) / Math.log(k.toDouble()))
        val pow = Math.pow(k.toDouble(), a.toDouble()).toLong()
        return n > 0 && pow == n.toLong()

    }
}

整数限制

这个来自于官解,这是人想出来的???

AC代码

public class Solution {
    public boolean isPowerOfThree(int n) {
        return n > 0 && 1162261467 % n == 0;
    }
}

总结

看似简单的一题,看了题解居然还有那么多种解法,好几种都是数学相关的,像什么换底公式啊,果然数学不亏是科学妈妈。

参考

3 的幂 - 3的幂 - 力扣(LeetCode) (leetcode-cn.com)

递归吧 - 3的幂 - 力扣(LeetCode) (leetcode-cn.com)

枚举即可 - 3的幂 - 力扣(LeetCode) (leetcode-cn.com)

换底公式 - 3的幂 - 力扣(LeetCode) (leetcode-cn.com)