这是我参与8月更文挑战的第19天,活动详情查看:8月更文挑战
题目描述:
326. 3的幂 - 力扣(LeetCode) (leetcode-cn.com)
给定一个 整数,写一个函数来判断它是否是 3 的幂次方。如果是,返回 true ;否则,返回 false 。
整数 n 是 3 的幂次方需满足:存在整数 x 使得
示例 1:
输入:n = 27
输出:true
示例 2:
输入:n = 0
输出:false
示例 3:
输入:n = 9
输出:true
示例 4:
输入:n = 45
输出:false
提示:
思路分析
数学法
即 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 是 3 的幂,那么 一定是个整数,由换底公式可以的得到 ,只需要判断 是不是整数即可。
同理该公式可以推广到 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)