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

题记:

给定一个整数,写一个函数来判断它是否是 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)

相关推荐
林开落L10 分钟前
前缀和算法习题篇(上)
c++·算法·leetcode
远望清一色11 分钟前
基于MATLAB边缘检测博文
开发语言·算法·matlab
tyler_download13 分钟前
手撸 chatgpt 大模型:简述 LLM 的架构,算法和训练流程
算法·chatgpt
青锐CC28 分钟前
webman使用中间件验证指定的控制器及方法[青锐CC]
中间件·前端框架·php
SoraLuna33 分钟前
「Mac玩转仓颉内测版7」入门篇7 - Cangjie控制结构(下)
算法·macos·动态规划·cangjie
我狠狠地刷刷刷刷刷36 分钟前
中文分词模拟器
开发语言·python·算法
鸽鸽程序猿37 分钟前
【算法】【优选算法】前缀和(上)
java·算法·前缀和
九圣残炎43 分钟前
【从零开始的LeetCode-算法】2559. 统计范围内的元音字符串数
java·算法·leetcode
YSRM1 小时前
Experimental Analysis of Dedicated GPU in Virtual Framework using vGPU 论文分析
算法·gpu算力·vgpu·pci直通
韭菜盖饭1 小时前
LeetCode每日一题3261---统计满足 K 约束的子字符串数量 II
数据结构·算法·leetcode