当前位置: 首页 > news >正文

Swift 解 LeetCode 326:两种方法判断是否是 3 的幂,含循环与数学技巧

在这里插入图片描述
在这里插入图片描述

文章目录

    • 摘要
    • 描述
      • 示例
    • 题解答案
      • 解法一:常规做法(循环除法)
      • 解法二:进阶做法(数学技巧,不用循环)
    • 题解代码分析
      • 解法一:循环除法
      • 解法二:不用循环的数学法
    • 示例测试及结果
    • 时间复杂度
    • 空间复杂度
    • 总结

摘要

很多人刷题的时候,一看到“某个数是不是几的幂”,就第一时间想循环除。但其实这类题有很多巧办法,尤其是对于 3 这种质数。今天这篇文章,我们就一起来聊聊怎么判断一个数是不是 3 的幂,不仅要搞清楚思路,还要学会用 Swift 写出干净、优雅的代码。

描述

题目很简单:

给定一个整数 n,请判断它是否是 3 的幂。

换句话说,如果存在整数 x,使得 n == 3^x,那么就返回 true,否则返回 false

示例

输入:n = 27
输出:true
解释:27 = 3^3
输入:n = 0
输出:false
解释:0 不能表示成任何 3 的幂
输入:n = 45
输出:false
解释:3 的幂分别是 1392781...,没有包含 45

题解答案

判断一个数是不是 3 的幂,有两种方式:

解法一:常规做法(循环除法)

func isPowerOfThree(_ n: Int) -> Bool {var n = nif n < 1 { return false }while n % 3 == 0 {n /= 3}return n == 1
}

解法二:进阶做法(数学技巧,不用循环)

func isPowerOfThree(_ n: Int) -> Bool {return n > 0 && 1162261467 % n == 0
}

1162261467 是 3 的最大幂次(在 Int32 范围内,即 3^19),只要这个值能被 n 整除,说明 n 是 3 的幂。

题解代码分析

解法一:循环除法

func isPowerOfThree(_ n: Int) -> Bool {var n = nif n < 1 { return false }while n % 3 == 0 {n /= 3}return n == 1
}

这个方法比较直观:

  • 先判断是否小于等于 0;
  • 然后一边除以 3,一边更新 n
  • 最终如果 n == 1,说明它是 3 的幂。

适合大多数初学者理解。

解法二:不用循环的数学法

func isPowerOfThree(_ n: Int) -> Bool {return n > 0 && 1162261467 % n == 0
}

这个方法利用了一个数学事实:

  • 在 32 位整数范围内,最大的 3 的幂是 3^19 = 1162261467
  • 如果一个数是 3 的幂,它一定可以整除 1162261467
  • 所以用取模来判断即可,不用任何循环或递归,效率极高。

示例测试及结果

print(isPowerOfThree(27))   // true,3^3
print(isPowerOfThree(0))    // false
print(isPowerOfThree(9))    // true,3^2
print(isPowerOfThree(45))   // false
print(isPowerOfThree(1))    // true,3^0
print(isPowerOfThree(243))  // true,3^5

运行结果:

true
false
true
false
true
true

时间复杂度

  • 解法一(循环除法): O(log₃(n)),每次除以 3
  • 解法二(数学法): O(1),常数级判断,效率最高

空间复杂度

  • 两种方法都不需要额外空间,属于 O(1) 常数级别。

总结

这题虽然是简单难度,但却是很多“幂类问题”的典型代表:

  • 循环除法是通用模板;
  • 取模法是进阶技巧,适用于质数幂判断(比如 2、3、5);
  • 如果题目加了“不允许循环或递归”,就可以考虑最大幂整除法。
http://www.dtcms.com/a/279207.html

相关文章:

  • ELK部署与使用详解
  • BGP基本配置
  • QGC 环境搭建踩坑记录
  • XML vs JSON:核心区别与最佳选择
  • IDEA实现纯java项目并打包jar(不使用Maven,Spring)
  • C++--priority_queue的模拟实现
  • 幻想读 通过多版本并发控制(MVCC)和间隙锁(Gap Lock)的组合也能防止幻读具体说下
  • Transformer江湖录 第五章:江湖争锋 - BERT vs GPT
  • 如何保护文件传输安全?文件传输加密
  • 企业数字化资产管理安全、成本、协作困局难解?
  • Java行为型模式(命令模式)应用场景分析
  • 数字化红头文件生成工具:提升群聊与团队管理效率的创新方案
  • Ubuntu安装 Redis
  • vscode/cursor怎么自定义文字、行高、颜色
  • Mysql数据库学习--多表查询
  • Eureka
  • Linux:3_基础开发⼯具
  • JAVA面试宝典 - 《MyBatis 进阶:插件开发与二级缓存》
  • 理解:进程、线程、协程
  • muduo面试准备
  • 文本预处理(四)
  • 2025-7-14-C++ 学习 排序(2)
  • 【LeetCode 热题 100】94. 二叉树的中序遍历——DFS
  • 死锁!哲学家进餐问题(操作系统os)
  • 光电融合新范式:长春光机所孙晓娟/李大冰团队《Light》发表铁电量子阱相纯度调控策略
  • 系统分析师第五课:进程通信-死锁-存储管理-固定分页分段
  • SpringMVC注解:@RequestParam 与 @PathVariable
  • 详解同步、异步、阻塞、非阻塞
  • 关于机械臂控制中的 MoveL 和 MoveJ 操作
  • Spring Boot + Thymeleaf + RESTful API 前后端整合完整示例