LeetCode - #227 基于 Swift 实现基本计算器

ops/2025/3/15 16:07:17/

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

摘要

在这篇文章中,我们将实现一个基于 Swift 语言的基本计算器。该计算器能够解析和计算包含 +-*/ 的数学表达式,并且遵循运算符的优先级规则。整数除法仅保留整数部分,不能使用 eval() 这样的内置解析方法。

描述

给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。

整数除法仅保留整数部分。

你可以假设给定的表达式总是有效的。所有中间结果将在 [-231, 231 - 1] 的范围内。

注意: 不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval()

示例 1:

输入: s = "3+2*2"
输出: 7

示例 2:

输入: s = " 3/2 "
输出: 1

示例 3:

输入: s = " 3+5 / 2 "
输出: 5

提示:

  • 1 <= s.length <= 3 * 105
  • s 由整数和算符 ('+', '-', '*', '/') 组成,中间由一些空格隔开
  • s 表示一个 有效表达式
  • 表达式中的所有整数都是非负整数,且在范围 [0, 231 - 1]
  • 题目数据保证答案是一个 32-bit 整数

题解答案

我们可以使用 栈(Stack) 来处理乘法和除法运算的优先级,同时遍历字符串,进行逐步计算。主要步骤如下:

  1. 遍历字符串 s,跳过空格。
  2. 当遇到数字时,将其解析出来。
  3. 当遇到运算符 +-*/ 时,根据之前的运算符决定如何处理:
    • + 直接将数字加入栈。
    • - 取相反数并加入栈。
    • * 取出栈顶元素,与当前数字相乘后再压入栈。
    • / 取出栈顶元素,与当前数字做整数除法后再压入栈。
  4. 遍历结束后,栈中的所有元素求和即为最终结果。

题解代码

swift">import Foundationfunc calculate(_ s: String) -> Int {var stack: [Int] = []var num = 0var sign: Character = "+"let chars = Array(s)for (i, char) in chars.enumerated() {if char.isNumber {num = num * 10 + char.wholeNumberValue!}if "+-*/".contains(char) || i == chars.count - 1 {switch sign {case "+": stack.append(num)case "-": stack.append(-num)case "*": stack.append(stack.removeLast() * num)case "/": stack.append(stack.removeLast() / num)default: break}sign = charnum = 0}}return stack.reduce(0, +)
}// 示例测试
let expr1 = "3+2*2"
let expr2 = " 3/2 "
let expr3 = " 3+5 / 2 "print(calculate(expr1))  // 输出: 7
print(calculate(expr2))  // 输出: 1
print(calculate(expr3))  // 输出: 5

题解代码分析

  1. 解析数字num = num * 10 + char.wholeNumberValue! 逐步解析多位数字。
  2. 处理运算符:当遇到 +-*/ 时,
    • +- 直接将数值(或其相反数)压入栈。
    • */ 取出栈顶元素,与当前数值计算后再压入栈。
  3. 求和:最后对栈中所有元素求和得到最终结果。

示例测试及结果

swift">calculate("3+2*2") // 输出: 7
calculate(" 3/2 ") // 输出: 1
calculate(" 3+5 / 2 ") // 输出: 5

时间复杂度

  • 遍历字符串一次: O(n)
  • 入栈出栈操作: O(1)(均摊)
  • 最终求和: O(n)

综合来看,时间复杂度为 O(n)

空间复杂度

  • 额外使用 stack 来存储运算结果,最坏情况下存储 n/2 个数,空间复杂度为 O(n)

总结

  • 通过 来处理 */ 的优先级问题。
  • 逐步解析数字,遇到操作符时再处理。
  • 遍历结束后计算栈内所有元素的总和 即可得到最终结果。
  • 时间复杂度 O(n),空间复杂度 O(n),适用于大规模输入。

http://www.ppmy.cn/ops/165981.html

相关文章

C++蓝桥杯基础篇(十一)

片头 嗨~小伙伴们&#xff0c;大家好&#xff01;今天我们来学习C蓝桥杯基础篇&#xff08;十一&#xff09;&#xff0c;学习类&#xff0c;结构体&#xff0c;指针相关知识&#xff0c;准备好了吗&#xff1f;咱们开始咯~ 一、类与结构体 类的定义&#xff1a;在C中&#x…

使用Arduino、ESP8266和GPS在Google地图上追踪车辆

使用 ESP8266、GPS 和 Google 地图的 Arduino Vehicle Tracker 如今,车辆跟踪系统变得非常重要,尤其是在车辆被盗的情况下。如果您的车辆安装了 GPS 系统,您可以跟踪您的车辆位置,它可以帮助警方追踪被盗车辆。 在这里,我们正在构建更高级版本的车辆跟踪系统,您可以在其…

鸿蒙 @ohos.arkui.componentUtils (componentUtils)

鸿蒙 ohos.arkui.componentUtils (componentUtils) 在鸿蒙开发中&#xff0c;ohos.arkui.componentUtils 模块提供了强大的功能&#xff0c;用于获取组件的绘制区域坐标和大小信息。这对于实现动态布局、交互效果以及用户界面测试等场景非常有用。本文将详细介绍如何使用 ohos…

无人机与互联网应用的技术发展方向与瓶颈分析

无人机与互联网应用的技术发展方向与瓶颈分析 一、技术发展方向 通信技术升级 5G/6G与低空网络覆盖&#xff1a;利用5G/6G的高带宽、低时延特性&#xff0c;实现无人机与地面控制中心、其他设备的实时交互。例如&#xff0c;无人机可通过5G网络传输4K视频流&#xff0c;用于灾…

CSS-三大特性,盒子模型,圆角边框,盒子阴影,文字阴影

一、 CSS 的三大特性 CSS 有三个非常重要的三个特性:层叠性&#xff64;继承性&#xff64;优先级&#xff61; 1.层叠性 相同选择器给设置相同的样式,此时一个样式就会覆盖(层叠)另一个冲突的样式&#xff61;层叠性主要解决样式冲突 的问题 层叠性原则: 样式冲突,遵循的原…

【AWS入门】2025 AWS亚马逊云科技账户注册指南

【AWS入门】2025 AWS亚马逊云科技账户注册指南 A Guide To Register a New account on AWS By JacksonML 0. AWS亚马逊云科技简介 Amazon Web Service(AWS) 即亚马逊云科技&#xff0c;其在全球Cloud Computing(云计算)市场占有最为重要的地位。 AWS连续13年被Gartner评为…

【IDEA插件开发】IntelliJ IDEA 插件开发指南

IntelliJ IDEA 插件开发指南 IntelliJ IDEA 是 JetBrains 开发的一款强大的 IDE&#xff0c;支持插件扩展&#xff0c;使其更具灵活性。你可以使用 Java 和 Maven 构建插件&#xff0c;实现各种自定义功能&#xff0c;比如代码自动生成、重构增强、代码检查等。 1. IDEA 插件开…

将 IPoIB 驱动修改为仅使用 RC 模式

摘要 本文档详细介绍了将 Linux 内核中的 IPoIB(IP over InfiniBand)驱动修改为仅使用 RC(Reliable Connection,可靠连接)模式,并移除所有与 TCP/IP 和以太网相关部分的方法。通过这些修改,可以优化 IPoIB 驱动以适应特定的高性能计算场景,提高数据传输的可靠性和效率…