IOS 算法(中级篇) ----- 基本计算器II
2021-03-12 本文已影响0人
ShawnAlex
给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
整数除法仅保留整数部分。
- 1 <= s.length <= 3 * 105
- s 由整数和算符 '+', '-', '*', '/' 组成,中间由一些空格隔开
- s 表示一个 有效表达式
- 表达式中的所有整数都是非负整数,且在范围 [0, 231 - 1] 内
- 题目数据保证答案是一个 32-bit 整数
例子:
输入:s = "3+2*2"
输出:7
输入:s = " 3/2 "
输出:1
输入:s = " 3+5 / 2 "
输出:5
解题思路:
栈方法
跟IOS 算法(困难篇) ----- 基本计算器类似, 依旧使用栈方法进行处理
数字进入栈
乘除将计算完数字进入栈
最后计算栈中元素之和
代码:
未翻译版
var ops = [String](), num = ""
func calculate(_ s: String) -> Int {
let temp = s.replacingOccurrences(of: " ", with: "")
for i in temp {
if i == "+" {
cal()
}else if i == "-" {
cal()
num += "-"
}else if i == "*" {
cal()
ops.append("*")
}else if i == "/" {
cal()
ops.append("/")
}else {
num += String(i)
}
}
cal()
var result = 0
for i in ops {
result += Int(i) ?? 0
}
return result
}
func cal() {
if ops.last == "*" {
ops.removeLast()
let mul1 = Int(ops.removeLast()) ?? 0, mul2 = Int(num) ?? 0
num = String(mul1 * mul2)
}else if ops.last == "/" {
ops.removeLast()
let div1 = Int(ops.removeLast()) ?? 0, div2 = Int(num) ?? 0
num = String(div1 / div2)
}
ops.append(num)
num = ""
}
翻译版
// 定义栈数组, num为数字容器
var ops = [String](), num = ""
func calculate(_ s: String) -> Int {
// temp为s去空格之后字符串
let temp = s.replacingOccurrences(of: " ", with: "")
// 循环
for i in temp {
if i == "+" {
// 数字入栈
cal()
}else if i == "-" {
// 数字入栈, num初始置为负"-"
cal()
num += "-"
}else if i == "*" {
// 数字入栈, 乘法多拼接 "*"
cal()
ops.append("*")
}else if i == "/" {
// 数字入栈, 乘法多拼接 "/"
cal()
ops.append("/")
}else {
// 普通情况数字拼接
num += String(i)
}
}
// 最后剩余数字入栈
cal()
// 计算栈中元素和即最后结果
var result = 0
for i in ops {
result += Int(i) ?? 0
}
//返回结果
return result
}
// 公共方法 ops栈中添加数字
func cal() {
if ops.last == "*" {
// 如果末尾是 * , 先计算乘法之后再入栈
// 移出" * "
ops.removeLast()
// 和之前元素做乘法
let mul1 = Int(ops.removeLast()) ?? 0, mul2 = Int(num) ?? 0
num = String(mul1 * mul2)
}else if ops.last == "/" {
// 如果是 / 先计算除法之后再入栈
// 移出" / "
ops.removeLast()
// 和之前元素做除法
let div1 = Int(ops.removeLast()) ?? 0, div2 = Int(num) ?? 0
num = String(div1 / div2)
}
// 数字入栈, 之后num至空字符串
ops.append(num)
num = ""
}
题目来源:力扣(LeetCode) 感谢力扣爸爸 :)
IOS 算法合集地址