Swift 解题:LeetCode 372 超级次方(Super Pow)

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

文章目录

    • 摘要
    • 描述
    • 题解答案
    • 题解代码分析
      • 代码解析
    • 示例测试及结果
    • 时间复杂度
    • 空间复杂度
    • 总结

摘要

在算法题里,有一些问题看似“简单”,比如算一个幂次方,但一旦放大规模就完全不同了。LeetCode 372 超级次方就是这样的题目。普通的幂运算没什么难度,但当指数 b 是一个用数组表示的上千位数字时,直接计算会导致溢出或者运行缓慢。本文会结合 Swift 给出可运行的解题方案,并分析其原理和实际应用场景。

描述

题目的要求是:
计算 a^b % 1337,其中:

  • a 是一个正整数(范围在 1 到 2³¹-1 之间)
  • b 是一个非常大的正整数,并且用数组形式存储(数组每一位是 b 的十进制数字)。

举几个例子:

  1. a = 2, b = [3]2^3 % 1337 = 8
  2. a = 2, b = [1,0]2^10 % 1337 = 1024
  3. a = 1, b = [4,3,3,8,5,2] → 无论怎么幂次,结果都是 1
  4. a = 2147483647, b = [2,0,0] → 结果 1198

核心难点

  • b 太大了,不能直接转成整数再做幂运算。

  • 普通幂运算会溢出,需要用模幂运算(modular exponentiation)。

  • 幂运算的拆分技巧:

    • a^(b1b2...bn) = ((a^(b1b2...bn-1))^10 * a^bn) % mod

题解答案

这题的关键在于“分治 + 快速幂 + 模运算”。
我们要不断从 b 的最后一位往前处理,把指数拆分为小块,然后应用公式:

a^1234 = ((a^123)^10) * a^4

这样我们就能一位一位处理 b,避免溢出。

题解代码分析

下面是 Swift 的解法:

import Foundationclass Solution {private let MOD = 1337func superPow(_ a: Int, _ b: [Int]) -> Int {return helper(a % MOD, b)}private func helper(_ a: Int, _ b: [Int]) -> Int {if b.isEmpty { return 1 }// 取出最后一位var newB = blet lastDigit = newB.removeLast()// 计算 (a^lastDigit % MOD)let part1 = modPow(a, lastDigit)// 计算 ((a^rest)^10 % MOD)let part2 = modPow(helper(a, newB), 10)return (part1 * part2) % MOD}// 快速幂取模private func modPow(_ base: Int, _ power: Int) -> Int {var result = 1var b = base % MODvar p = powerwhile p > 0 {if p % 2 == 1 {result = (result * b) % MOD}b = (b * b) % MODp /= 2}return result}
}

代码解析

  1. superPow:入口函数,先对 a 取模,避免不必要的大数计算。

  2. helper:递归函数,把数组 b 的最后一位拿出来处理。

    • part1 = a^lastDigit % MOD
    • part2 = (a^rest)^10 % MOD
    • 然后组合结果 (part1 * part2) % MOD
  3. modPow:快速幂函数,通过二分法计算 (base^power) % MOD,避免指数过大。

这种写法巧妙地利用了指数展开公式和快速幂,既避免了大数溢出,也保证了运行效率。

示例测试及结果

我们用几个例子跑一下:

let solution = Solution()print(solution.superPow(2, [3]))              // 输出: 8
print(solution.superPow(2, [1,0]))           // 输出: 1024
print(solution.superPow(1, [4,3,3,8,5,2]))   // 输出: 1
print(solution.superPow(2147483647, [2,0,0])) // 输出: 1198

运行结果:

8
1024
1
1198

跟题目给的示例完全一致

时间复杂度

  • 快速幂函数 modPow 的时间复杂度是 O(log power)
  • 我们对 b 的每一位数字都要调用一次 modPow,所以总复杂度是 O(len(b) * log a)
  • 对于 len(b) <= 2000,这个复杂度是完全可以接受的。

空间复杂度

  • 递归的深度取决于 b 的长度,最多 2000。
  • 所以空间复杂度是 O(len(b))

总结

这道题的精髓在于:

  1. 不能直接算,要学会把指数拆分。
  2. 快速幂 + 模运算是大数幂问题的通用解法。
  3. 实际场景里,类似的思路常见于加密算法(比如 RSA),因为加密里经常需要计算“大数的模幂运算”。

所以这题不仅仅是算法训练题,还能让我们更好地理解实际中的密码学和大数运算的实现方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/98077.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/98077.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

揭秘23种设计模式的艺术与技巧之结构型

结构型模式&#xff1a;优化软件结构的策略代理模式&#xff08;Proxy Pattern&#xff09;代理模式就像一个经纪人&#xff0c;代表真实对象进行操作。比如&#xff0c;在网络访问中&#xff0c;我们可能会通过代理服务器来访问外部网站。在软件中&#xff0c;当一个对象由于某…

PyTorch图像数据转换为张量(Tensor)并进行归一化的标准操作

transform ToTensor() 是 PyTorch 中用于将图像数据转换为张量&#xff08;Tensor&#xff09;并进行归一化的标准操作&#xff0c;以下是对其功能的逐层解析及关键细节&#xff1a;核心功能总结功能描述类型转换将 PIL Image / numpy 数组 → PyTorch Tensor (dtype: torch.f…

HarmonyOS学习

一&#xff0c;DevEoc Studio基本内容学习项目工程目录entry 默认的项目入口模块ets 界面相关文件&#xff08;目前都放入pages文件内即可&#xff09;resource资源文件&#xff0c;配置文件index.est默认文件’ ‘开头的一般为装饰器&#xff0c;修饰功能&#xff0c;来约定后…

【大前端】Vue 和 React 主要区别

Vue 与 React 的主要区别 在前端开发领域&#xff0c;Vue 和 React 是两大最受欢迎的框架/库。尽管它们都可以帮助我们构建现代化的 Web 应用&#xff0c;但在设计理念、开发方式、生态系统等方面有许多不同。本文将从多个角度对两者进行对比。 目录 框架与库的定位核心理念…

高级RAG策略学习(五)——llama_index实现上下文窗口增强检索RAG

LlamaIndex上下文窗口实现详解 概述 本文档详细讲解基于LlamaIndex框架实现的上下文窗口RAG系统&#xff0c;重点分析关键步骤、语法结构和参数配置。 1. 核心导入与环境配置 1.1 必要模块导入 from llama_index.core import Settings from llama_index.llms.dashscope import …

Doris 数据仓库例子

基于 Apache Doris 构建数据仓库的方案和具体例子。Doris 以其高性能、易用性和实时能力&#xff0c;成为构建现代化数据仓库&#xff08;特别是 OLAP 场景&#xff09;的优秀选择。一、为什么选择 Doris 构建数据仓库&#xff1f;Doris&#xff08;原名 Palo&#xff09;是一个…

WebRTC进阶--WebRTC错误Failed to unprotect SRTP packet, err=9

文章目录 原因分析 SRTP Anti-Replay 机制 客户端源码 err=9 的定义: 为什么会触发 replay_fail ✅ 解决方向 原因分析 SRTP Anti-Replay 机制 SRTP 收包时会用一个 Replay Window(64/128个序列号大小)检查 seq 是否合理。 如果你构造的恢复包 recover_seq 比当前接收窗口…

Web服务与Nginx详解

文章目录前言一、Web 概念1.1 Web 的基本概念1.1.1 特点1.2 B/S 架构模型1.3 Web 请求与响应过程1.4 静态资源与动态资源1.5 Web 的发展阶段1.6 实验&#xff1a;搭建最小 Web 服务1.6.1 实验目标1.6.2 实验步骤1.7 小结二、HTTP 与 HTTPS 协议2.1 HTTP 与 HTTPS 的区别2.2 HTT…

CC-Link IE FB 转 DeviceNet 实现欧姆龙 PLC 与松下机器人在 SMT 生产线锡膏印刷环节的精准定位控制

案例背景在电子制造行业&#xff0c;SMT&#xff08;表面贴装技术&#xff09;生产线对设备的精准控制要求极高。某电子制造企业的 SMT 生产线中&#xff0c;锡膏印刷机、SPI&#xff08;锡膏厚度检测仪&#xff09;等前段设备采用了基于 CC-Link IE FB 主站的欧姆龙 NJ 系列 P…

IP5326_BZ 支持C同口输入输出的移动电源芯片 2.4A的充放电电流 支持4LED指示灯

IP5326 是一款集成升压转换器、锂电池充电管理、电池电量指示的多功能电源管理 SOC&#xff0c;为移动电源提供完整的电源解决方案。得益于 IP5326 的高集成度与丰富功能,使其在应用时仅需极少的外围器件&#xff0c;并有效减小整体方案的尺寸&#xff0c;降低 BOM 成本。IP532…

若依基础学习

若依基础学习 1.修改数据库密码以及连接名&#xff1a; RuoYi-Vue-master\ruoyi-admin\src\main\resources\application-druid.yml2.各个文件作用&#xff1a; ruoyi-admin (主启动)├── ruoyi-framework (框架核心)│ ├── ruoyi-common (通用工具)│ └── ruoyi-sy…

靶向肽Dcpep

名称&#xff1a;靶向肽Dcpep三字母序列&#xff1a;NH2-Phe-Tyr-Pro-Ser-Tyr-His-Ser-Thr-Pro-Gln-Arg-Pro-OH单字母序列&#xff1a;NH2-FYPSYHSTPQRP-OH分子式&#xff1a;C69H94N18O19分子量&#xff1a;1479.62备注&#xff1a;仅供科研&#xff0c;不用于人体简述&#x…

华为在国内搞的研发基地有多野?标杆游学带你解锁“研发界顶流”

宝子们&#xff01;原来华为在国内有这么多“宝藏研发基地”&#xff0c;之前总觉得遥不可及走进深圳坂田总部——1.3平方公里的园区&#xff0c;走进去就像进了“科技版大观园”&#xff0c;21层研发主楼看着就很有气势&#xff0c;天鹅湖边的路全用科学家名字命名&#xff0c…

linux缺页中断频繁怎么定位

1,怎么看内存是否有缺页中断 查看日志: dmesg | grep “do fault” perf record -e page-faults -g -p <PID> 系统级监控: 使用 vmstat 查看全局缺页中断(si/so 表示换入/换出页数) vmstat 1 # 每秒刷新,观察 si/so 列 iostat显示磁盘使用情况,举例iostat -x …

06-Hadoop生态系统组件(2)

4. 数据查询组件 4.1 Apache Hive详解 from typing import Dict, List, Any, Optional, Tuple, Union from dataclasses import dataclass from enum import Enum from datetime import datetime import re import jsonclass HiveTableType(Enum):"""Hive表类型…

【自动化实战】Python操作Excel/WORD/PDF:openpyxl与docx库详解

在现代办公环境中&#xff0c;我们经常需要处理各种文档格式&#xff0c;如Excel表格、Word文档和PDF文件。手动处理这些文档不仅耗时&#xff0c;而且容易出错。Python提供了多个强大的库来实现文档处理的自动化&#xff0c;本文将重点介绍如何使用openpyxl和docx库来操作Exce…

构建安全的自动驾驶:软件测试中的编码规范与AI验证

自动驾驶不再只是未来想象&#xff0c;它正在以惊人的速度走向现实。但这一变革也带来了软件开发的全新命题。与传统车辆不同&#xff0c;自动驾驶依赖复杂的AI模型、传感系统和车载决策单元&#xff0c;必须应对更多现实环境的不确定性。在强监管、高风险、快节奏的背景下&…

2025高教社数学建模国赛C题 - NIPT的时点选择与胎儿的异常判定(完整参考论文)

基于机器学习与统计模型的NIPT检测优化与异常判定问题研究 摘要 非侵入性产前检测(NIPT)作为一种无创安全的胎儿染色体异常筛查技术,在现代产前医疗中发挥着重要作用,其准确性与检测时机及异常判定的科学性直接影响临床决策。然而,男胎Y染色体浓度受孕周数、孕妇BMI等多…

一种基于注解与AOP的Spring Boot接口限流防刷方案

1. 添加Maven依赖<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupI…

代码随想录二刷之“贪心算法”~GO

简单题目 1.455. 分发饼干 - 力扣&#xff08;LeetCode&#xff09; func findContentChildren(g []int, s []int) int {sort.Ints(g)sort.Ints(s)index : 0for i : 0;i<len(s);i{if index < len(g) && g[index] < s[i]{index}}return index }感悟&#xff…