题记:
给定一个整数,写一个函数来判断它是否是 3 的幂次方。如果是,返回 true ;否则,返回 false 。
整数 n 是 3 的幂次方需满足:存在整数 x 使得 n == 3^x
示例 1:
输入 :n = 27
输出:true
示例 2:
输入 :n = 0
输出:false
示例 3:
输入 :n = 9
输出:true
示例 4:
输入 :n = 45
输出:false
提示:
-2 ^ 31 <= n <= 2 ^ 31 - 1
进阶:你能不使用循环或者递归来完成本题吗?
题目来源:
作者:LeetCode
链接:https://leetcode.cn/leetbook/read/top-interview-questions-easy/xnsdi2/
来源:力扣(LeetCode)
解题方法:
自己敲的:
一:循环,一直乘以3,判断是否有等于该整数的数存在
php
function isPowerOfThree($n) {
//循环
if($n == 3 || $n == 1)
return true;
$start = 3;
while($start && $start <= $n){
$start = $start * 3;
if($start == $n){
return true;
}
}
return false;
}
二:递归,一直除以3
php
function isPowerOfThree($n) {
//递归
if($n == 1)
return true;
if($n > 0 && $n % 3 == 0 && $this->isPowerOfThree($n / 3))
return true;
return false;
}
官方方法:(其实也就是一直乘以3)
php
function isPowerOfThree($n) {
$flag = true;
$num = 0;
while($flag){
$x = pow(3,$num); //3的num次方
$num++;
if($x > $n){
$flag = false;
return false;
}
if($x == $n){
$flag = false;
return true;
}
}
}
其他方法:
一:一直除以3
一种最简单的方式就是判断n是否能够被3整除,如果能够被3整除就除以3,直到不能被3整除为止,最后判断n是否等于1,代码比较简单,来看下
java
public boolean isPowerOfThree(int n) {
if (n > 1)
while (n % 3 == 0)
n /= 3;
return n == 1;
}
转换为PHP代码为:
php
function isPowerOfThree($n) {
//一直除以3
if($n > 1){
while($n % 3 == 0){
$n /= 3;
}
}
return $n == 1;
}
二:递归方式解决(同上面的递归方法,只是简化了写法)
还可以改为递归的方式,一行代码解决
java
public boolean isPowerOfThree(int n) {
return n > 0 && (n == 1 || (n % 3 == 0 && isPowerOfThree(n / 3)));
}
转换为PHP代码为:
php
function isPowerOfThree($n) {
return $n > 0 && ($n == 1 || ($n % 3 == 0 && $this->isPowerOfThree($n / 3)));
}
三:算术表达式计算
先来普及一波数学知识
对数的乘法法则: log(ab) = log(a) + log(b)
对数的乘法法则表明,两个数相乘的对数等于这两个数分别对数后的和。例如,log(10100) = log(10) + log(100) = 1 + 2 = 3。
对数的除法法则: log(a/b) = log(a) - log(b)
对数的除法法则表明,两个数相除的对数等于这两个数分别对数后的差。例如,log(100/10) = log(100) - log(10) =
2 - 1 = 1。
对数的幂法法则: log(a^b) = blog(a)
对数的幂法法则表明,一个数的幂的对数等于这个数的对数乘以幂的指数。例如,log(10^3) = 3log(10) = 3*1 = 3。
对数的换底公式: loga(b) = logc(b)/logc(a)
对数的换底公式表明,任意两个底不同的对数可以用一个公共底的对数来表示。例如,log2(8) = log10(8)/log10(2) =
0.903/0.301 = 3。
java
public boolean isPowerOfThree(int n) {
return (Math.log10(n) / Math.log10(3)) % 1 == 0;
//对照对数的换底公式
//log3(n)
}
四:找到最大幂
题中n的范围是 -2^31 <= n <= 2^31 - 1 ,而在这个范围内3的最大幂是1162261467,在比他大就超过int表示的范围了,我们直接用它对n求余即可,过求余的结果是0,说明n是3的幂次方
java
public boolean isPowerOfThree(int n) {
return (n > 0 && 1162261467 % n == 0);
}
转换为PHP代码为:
php
function isPowerOfThree($n) {
return ($n > 0 && 1162261467 % $n == 0);
}
方法来源:
作者:数据结构和算法
链接:https://leetcode.cn/leetbook/read/top-interview-questions-easy/xnsdi2/?discussion=xhUFcs
来源:力扣(LeetCode)