当前位置: 首页 > 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.xdnf.cn/news/1119079.html

相关文章:

  • APK安装器(安卓端)一键解除VX限制!轻松安装各种手机应用
  • 一键获取android公钥/ios公钥工具
  • Java面试总结(经典题)(Java多线程)(一)
  • 基于Hadoop的竞赛网站日志数据分析与可视化(上)
  • 八、nginx搭建,实现vue跳转nginx跳转gateway
  • 基于hadoop的竞赛网站日志数据分析与可视化(下)
  • pycharm恢复出厂设置,可以解决大多数pycharm存在的问题
  • idea下无法打开sceneBulider解决方法
  • LINUX714 自动挂载/nfs;物理卷
  • Relocations in generic ELF (EM: 40)
  • OPENPPP2 VEthernet 网络协议堆栈(CTCP)VNetStack 深度技术解析
  • #Paper Reading# Apple Intelligence Foundation Language Models
  • 硬件工程师笔试面试高频考点汇总——(2025版)
  • ROS2中的QoS(Quality of Service)详解
  • Lucene原理
  • Linux | 数据库操作基础
  • 从文本中 “提取” 商业洞察“DatawhaleAI夏令营”
  • MCP 服务开发到发布
  • 1.1.5 模块与包——AI教你学Django
  • 大模型微调(一):基于Swift框架进行自我认知微调(使用Lora微调Qwen3-8B模型)
  • 系规备考论文:论IT服务部署实施方法
  • 17.使用DenseNet网络进行Fashion-Mnist分类
  • 【数据结构】图 ,拓扑排序 未完
  • INA226 数据手册解读
  • HTTP与HTTPS详解
  • 闲庭信步使用图像验证平台加速FPGA的开发:第十二课——图像增强的FPGA实现
  • opencv4.12 vs2022 cmake contrib编译
  • 基于MATLAB的Lasso回归的数据回归预测方法应用
  • 零基础完全理解视觉语言模型(VLM):从理论到代码实践
  • 【Mysql作业】