LeetCode 326 3的幂

server/2025/3/22 0:17:34/

判断一个数是否是 3 的幂次方:Java 实现与算法分析

一、问题描述

给定一个整数 n,编写一个函数判断它是否是 3 的幂次方。
满足条件:存在整数 x 使得 n == 3^x
示例

  • 输入:27 → 输出:true(3³=27)
  • 输入:0 → 输出:false(3 的任何次幂都不为 0)
  • 输入:-3 → 输出:false(幂次方结果为正整数)

二、解决方案

方法一:循环迭代法(通用思路)

核心思想

不断将数字除以 3,直到无法整除为止。若最终结果为 1,则是 3 的幂;否则不是。
步骤

  1. 处理边界条件:n ≤ 0 直接返回 false(3 的幂必为正整数)。
  2. 循环除以 3,直到余数不为 0。
  3. 检查最终结果是否为 1。
代码实现
java">class Solution {public boolean isPowerOfThree(int n) {if (n < 1) { // 处理负数和0return false;}while (n % 3 == 0) { // 能被3整除时继续除n /= 3;}return n == 1; // 最终结果是否为1}
}
复杂度分析
  • 时间复杂度:O (log₃n),循环次数等于 3 的幂次(如 3¹⁹需要循环 19 次)。
  • 空间复杂度:O (1),仅使用常数额外空间。
优缺点
  • 优点:通用,适用于判断任意数的幂(如 2 的幂、5 的幂)。
  • 缺点:大数时循环次数较多(如 3¹⁹需要 19 次循环)。

方法二:数学性质法(Java 特化优化)

核心思想

利用 Java 中int类型的范围限制:

  • int最大值为 2¹⁴⁷⁴⁸³⁶⁴⁷,3 的最大幂次方为 3¹⁹ = 1,162,261,467(3²⁰超过 int 范围)。
  • n是 3 的幂,则1,162,261,467必能被n整除(因为 3¹⁹是 3 的所有幂的倍数)。
代码实现
java">class Solution {public static final int MAX_POWER_OF_3 = 1162261467; // 3¹⁹public boolean isPowerOfThree(int n) {return n > 0 && MAX_POWER_OF_3 % n == 0;}
}
关键细节
  • 边界条件n > 0 排除负数和 0。
  • 数学原理:3¹⁹是 3 的所有幂的倍数(如 3⁰=1,3¹=3,…,3¹⁹)。若n是 3 的幂,则必为 3¹⁹的因数。
复杂度分析
  • 时间复杂度:O (1),仅一次取模运算。
  • 空间复杂度:O (1),常数空间。
优缺点
  • 优点:极致优化,常数时间复杂度。
  • 缺点:依赖编程语言的整数范围(如 Java 的int),移植性较差。

三、两种方法对比

维度循环迭代法数学性质法
通用性高(任意基数的幂)低(仅适用于 3 的幂 + Java)
时间复杂度O(log₃n)O(1)
空间复杂度O(1)O(1)
边界处理显式判断(n < 1)隐式包含(n > 0)
适用场景通用场景、其他语言(如 C++)Java 场景、追求极致性能

四、测试用例

输入(n)预期输出解释
0false3 的幂不能为 0
1true3⁰=1
3true3¹=3
9true3²=9
27true3³=27
45false45=3²×5,含其他质因数
-3false负数不可能是 3 的幂
1162261467true3¹⁹(最大 3 的幂)

五、扩展思考

  1. 如何判断 2 的幂?
    • 循环法:同上。
    • 数学法:利用位运算(n & (n-1) == 0),更高效。
  2. 大数处理:若n超过int范围(如long),数学法需调整最大幂值。
  3. 质因数分解:3 的幂的质因数只能是 3。若n的质因数包含其他数(如 5),则不是 3 的幂。

六、总结

  • 循环迭代法:通用、易理解,适合教学和通用场景。
  • 数学性质法:Java 特化优化,极致性能,适合已知整数范围的场景。
  • 选择建议:根据语言特性和场景选择。若需跨语言或通用逻辑,选循环法;若追求极致性能(Java),选数学法。

七、完整代码(含测试)

java">class Solution {// 方法一:循环迭代法public boolean isPowerOfThreeLoop(int n) {if (n < 1) return false;while (n % 3 == 0) n /= 3;return n == 1;}// 方法二:数学性质法private static final int MAX_POWER = 1162261467;public boolean isPowerOfThreeMath(int n) {return n > 0 && MAX_POWER % n == 0;}// 测试示例public static void main(String[] args) {Solution solution = new Solution();int[] testCases = {0, 1, 3, 9, 27, 45, -3, 1162261467};for (int n : testCases) {boolean loopResult = solution.isPowerOfThreeLoop(n);boolean mathResult = solution.isPowerOfThreeMath(n);System.out.printf("n=%-10d 循环法:%-5b 数学法:%-5b%n", n, loopResult, mathResult);}}
}

输出结果

java">n=0          循环法:false  数学法:false  
n=1          循环法:true   数学法:true   
n=3          循环法:true   数学法:true   
n=9          循环法:true   数学法:true   
n=27         循环法:true   数学法:true   
n=45         循环法:false  数学法:false  
n=-3         循环法:false  数学法:false  
n=1162261467 循环法:true   数学法:true   

http://www.ppmy.cn/server/176909.html

相关文章

Leetcode 160 Intersection of Two Linked Lists

题意 给定两个链表&#xff0c;找这两个链表第一个公共节点&#xff0c;如果没有返回nullptr 题目链接 https://leetcode.com/problems/intersection-of-two-linked-lists/description/ 题解 两个指针分别从两个链表&#xff08;记录为表A&#xff0c;表B&#xff09;的表…

嵌入式硬件篇---龙芯PWM生成

文章目录 前言1. 头文件引入作用 2. 导出PWM通道 pwm_export功能关键点问题 3. 取消导出PWM通道 pwm_unexport作用注意 4. 启用/禁用PWM pwm_enable/pwm_disable功能改进建议 5. 配置周期和占空比 pwm_config作用关键点示例 6. 设置极性 pwm_polarity功能潜在问题 7.龙芯2K1000…

3.3 二分查找专题: LeetCode 35. 搜索插入位置

1. 题目链接 LeetCode 35. 搜索插入位置 2. 题目描述 给定一个升序排列的整数数组 nums 和一个目标值 target&#xff0c;要求&#xff1a; 若 target 存在于数组中&#xff0c;返回其索引。若不存在&#xff0c;返回其应插入的位置&#xff0c;使得插入后数组仍保持有序。 …

QT国产化系统软件开发

一、国产操作系统 1、鸿蒙HarmonyOS NEXT ‌核心架构‌ 采用自研鸿蒙内核&#xff0c;完全脱离Linux与AOSP代码&#xff0c;基于分布式架构实现跨设备资源虚拟化整合&#xff0c;支持动态调度多终端硬件能力‌。通过分布式软总线技术&#xff08;D-Bus&#xff09;实现低时延…

HarmonyOS-UIAbility 启动模式

简介 HarmonyOS涉及的启动模式&#xff0c;就是Android中的那个启动模式&#xff0c;一样的概念。它指的是一个UIAbility实例&#xff0c;被打开的时候&#xff0c;如果已经存在了UIAbility&#xff0c;是复用上一个呢&#xff0c;还是重新创建一个呢&#xff0c; 如果复用的话…

2025,游戏出海的致命伤

据最新发布的《2025年1月中国游戏产业月度报告》&#xff0c;仅今年 1 月&#xff0c;中国自研游戏海外收入就同比暴涨 28.65%&#xff0c;突破 16.75 亿美元。《原神》《鸣潮》创下的佳绩之外&#xff0c;中轻度 SLG《小舰舰超勇》空降美国下载榜&#xff0c;一举占据 TOP 10 …

17.1Go语言操作MongoDB

驱动安装 go get go.mongodb.org/mongo-driver/mongo基础连接示例 package mainimport ("context""fmt""log""time""go.mongodb.org/mongo-driver/mongo""go.mongodb.org/mongo-driver/mongo/options" )func mai…

OpenCV计算摄影学(23)艺术化风格化处理函数stylization()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 风格化的目的是生成不以照片写实为目标的多种多样数字图像效果。边缘感知滤波器是风格化处理的理想选择&#xff0c;因为它们能够弱化低对比度区…