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

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

摘要

在这篇文章中,我们将实现一个基于 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. 遍历结束后,栈中的所有元素求和即为最终结果。

题解代码

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. 求和:最后对栈中所有元素求和得到最终结果。

示例测试及结果

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.rhkb.cn/news/33647.html

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

相关文章

智慧应急消防解决方案(35页PPT)(文末有下载方式)

详细资料请看本解读文章的最后内容。在当今社会&#xff0c;消防安全至关重要&#xff0c;关乎人民生命财产安全和社会稳定。随着科技的飞速发展&#xff0c;智慧应急消防解决方案应运而生&#xff0c;为消防工作带来了新的变革和机遇。接下来&#xff0c;让我们深入探讨这份智…

网络安全反渗透 网络安全攻防渗透

网络渗透防范主要从两个方面来进行防范&#xff0c;一方面是从思想意识上进行防范&#xff0c;另一方面就是从技术方面来进行防范。 1.从思想意识上防范渗透 网络攻击与网络安全防御是正反两个方面&#xff0c;纵观容易出现网络安全事故或者事件的公司和个人&#xff0c;在这些…

2025-03-15 学习记录--C/C++-PTA 练习3-4 统计字符

合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、题目描述 ⭐️ 练习3-4 统计字符 本题要求编写程序&#xff0c;输入10个字符&#xff0c;统计其中英文字母、空格或回车、…

11a-PPDU

## 前导码和信令 OFDM 物理层&#xff08;PHY&#xff09;的 PPDU&#xff08;物理层协议数据单元&#xff09;格式包含以下实体信息&#xff1a; - **PPDU 组成**&#xff1a;由 OFDM PHY preamble&#xff08;前导码&#xff0c;12 个符号&#xff09;、PHY header&#xff…

TF-IDF:文本挖掘中的关键词提取利器

引言 在自然语言处理&#xff08;NLP&#xff09;和文本挖掘中&#xff0c;TF-IDF是一种常用的技术&#xff0c;用于评估一个词在文档中的重要性。它不仅在信息检索领域广泛应用&#xff0c;还在文本分类、关键词提取等任务中发挥着重要作用。本文将详细介绍TF-IDF的原理…

[新能源]新能源汽车快充与慢充说明

接口示意图 慢充接口为交流充电口&#xff08;七孔&#xff09;&#xff0c;快充接口为直流充电口&#xff08;九孔&#xff09;。 引脚说明 上图给的是充电口的引脚图&#xff0c;充电枪的为镜像的。 慢充接口引脚说明 快充接口引脚说明 充电流程 慢充示意图 慢充&…

docker3-容器与镜像命令

前言 容器命令[部分] docker run –name“nginx-lb” 这个就是为容器起一个名称 以前是随机起的名称 docker run -d --name mynginx1 nginx:1.24.0 docker ps 这样就可以看到我们起的名字了 docker stop mynginx1 这个就可以停掉指定名字的容器了&#xff0c;但不是删除…

vue/react/vite前端项目打包的时候加上时间最简单版本,防止后端扯皮

如果你是vite项目&#xff0c;直接写一个vite的插件&#xff0c;通过这个插件可以动态注入环境变量&#xff0c;然后当打包的时候&#xff0c;自动注入这个时间到环境变量中&#xff0c;然后在项目中App.vue中或者Main.tsx中打印出来&#xff0c;这就知道是什么时候编译的项目了…

Linux中Gdb调试工具常用指令大全

1.gdb的安装 如果你是root用户直接用指令 &#xff1a;yum install gdb &#xff1b;如果你是普通用户用指令&#xff1a;sudo yum install gdb&#xff1b; 2.gdb调试前可以对你的makefile文件进行编写&#xff1a; 下面展示为11.c文件编写的makefile文件&#xff1a; code…

go 安装swagger

1、依赖安装&#xff1a; # 安装 swag 命令行工具 go install github.com/swaggo/swag/cmd/swaglatest# 安装 gin-swagger 和 swagger 文件的依赖 go get -u github.com/swaggo/gin-swagger go get -u github.com/swaggo/files 2、测试 cmd中输入&#xff1a; swag -v 如果…

数据库---sqlite3

数据库&#xff1a; 数据库文件与普通文件区别: 1.普通文件对数据管理(增删改查)效率低 2.数据库对数据管理效率高,使用方便 常用数据库: 1.关系型数据库: 将复杂的数据结构简化为二维表格形式 大型:Oracle、DB2 中型:MySql、SQLServer …

go的gmp

参考链接&#xff1a;https://www.bilibili.com/video/BV19r4y1w7Nx Golang的GMP调度模型(协程调度器)是其并发编程的核心。GMP代表Goroutine、Machine和Processor三个关键组成部分。Goroutine是Go语言中的轻量级线程&#xff0c;Machine是操作系统的线程&#xff0c;Processor…

标贝自动化数据标注平台推动AI数据训练革新

随着人工智能&#xff08;AI&#xff09;技术的快速发展&#xff0c;数据标注作为AI模型训练的关键环节&#xff0c;其重要性日益凸显。传统的人工数据标注方式虽然能够提供高质量的标注数据&#xff0c;但存在效率低、成本高、一致性差等问题。为了解决这些问题&#xff0c;标…

从传统制动到线控制动:技术变革与挑战

随着汽车产业从传统机械时代迈向电动化、智能化时代&#xff0c;车辆底盘的“线控化”已经成为重要发展趋势。其中&#xff0c;线控制动系统&#xff08;Brake-by-Wire&#xff0c;简称BBW&#xff09;是该趋势的核心一环。传统的制动系统主要依赖真空助力或液压传动&#xff0…

Java---JavaSpringMVC解析(1)

Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架&#xff0c;从⼀开始就包含在 Spring 框架中。它的正式名称“Spring Web MVC”来⾃其源模块的名称(Spring-webmvc)&#xff0c;但它通常被称为"Spring MVC" 1.MVC MVC是Model View Controller的缩写&#…

VSTO(C#)Excel开发8:打包发布安装卸载

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

地下停车场调频广播覆盖:破解地下车库无线广播收听孤岛,技术赋能地下停车场FM调频无线广播覆盖

地下停车场调频广播覆盖&#xff1a;破解地下车库无线广播收听孤岛&#xff0c;技术赋能地下停车场FM调频无线广播覆盖 北京海特伟业科技有限公司任洪卓于2025年3月14日发布 地下停车场调频广播覆盖系统建设背景 随着城市化进程的加速&#xff0c;地下停车场已成为现代建筑不…

kettle的转换中sql不按设计顺序执行原因分析与解决办法

1.问题描述 如图&#xff0c;通过箭头指定多个SQL脚本的先后顺序&#xff0c;实际各个sql没有阻塞&#xff0c;没有等待&#xff0c;几乎是并行&#xff0c;与预期不符。 2.原因 转换文件&#xff08;.ktr&#xff09; 用于控制数据的流量&#xff0c;比如表输入指向表输出节…

P1259 黑白棋子的移动【java】【AC代码】

有 2n 个棋子排成一行&#xff0c;开始为位置白子全部在左边&#xff0c;黑子全部在右边&#xff0c;如下图为 n5 的情况&#xff1a; 移动棋子的规则是&#xff1a;每次必须同时移动相邻的两个棋子&#xff0c;颜色不限&#xff0c;可以左移也可以右移到空位上去&#xff0c;但…

P6772 [NOI2020] 美食家

训练角度&#xff1a;图上的状态转移&#xff0c;倍增 → \rightarrow → 优化状态转移&#xff1b; ▍ 题意 精灵王国共有 n n n 座城市&#xff0c;城市从 1 1 1 到 n n n 编号&#xff0c;其中城市 i i i 的美食能为小 W 提供 c i c_i ci​ 的愉悦值。精灵王国的城市…