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

相关文章:

  • [硬件电路-21]:模拟信号处理运算与数字信号处理运算的详细比较
  • 无人机迫降模式模块运行方式概述!
  • ICMP隧道工具完全指南:原理、实战与防御策略
  • Datawhale AI夏令营大模型 task2.1
  • 【科研绘图系列】R语言绘制世界地图
  • 硬盘爆满不够用?这个免费神器帮你找回50GB硬盘空间
  • 【React Natve】NetworkError 和 TouchableOpacity 组件
  • 网络编程(TCP连接)
  • 代理模式详解:代理、策略与模板方法模式
  • 暑期自学嵌入式——Day02(C语言阶段)
  • PyTorch张量(Tensor)创建的方式汇总详解和代码示例
  • 如何降低AIGC的查重率?精选六个AIGC降重让论文更出色
  • 《每日AI-人工智能-编程日报》--2025年7月14日
  • Android Studio C++/JNI/Kotlin 示例 三
  • git项目,有idea文件夹,怎么去掉
  • Mybatis(黑马)
  • 网络传输过程
  • 理解Linux文件系统:从物理存储到统一接口
  • 小波变换 | 离散小波变换
  • 学习笔记——农作物遥感识别与大范围农作物类别制图的若干关键问题
  • rsyslog简单应用
  • Linux中的系统日志(Rsyslog)
  • 算法训练营day17 654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树
  • Linux —— A / 基础指令
  • 深入解析Hadoop YARN架构设计:从原理到实践
  • 019 进程控制 —— 进程程序替换
  • SpringMVC2
  • 力扣-138.随机链表的复制
  • 一分钟K线实时数据数据接口,逐笔明细数据接口,分时成交量数据接口,实时五档委托单数据接口,历史逐笔明细数据接口,历史分时成交量数据接口
  • 深入理解MyBatis延迟加载:原理、配置与实战优化