主要观点总结
本文介绍了三个不同题目的解法,包括算式求解、找出升序数组中和为给定值的两个数字以及根据字符串中的时间信息排序并输出。
关键观点总结
关键观点1: 题目一:算式求解
本题属于经典的中缀表达式计算类栈题,维护preSign变量来表示上一个数字是加法还是减法。可以直接调用eval() API进行求解,也可以根据等于号"="对字符串进行切割,将切割后的各个字串传入eval()得到各个子串的计算结构,再做求和。
关键观点2: 题目二:找出升序数组中和为给定值的两个数字
本题和LeetCode167. 两数之和 II - 输入有序数组基本完全一致,属于贪心类的相向双指针题目。注意输出格式的要求,若结果异常或未找到,后两个数字返回均为0。
关键观点3: 题目三:根据字符串中的时间信息排序并输出
本题是模拟排序题,需要遍历每一个子串中长度为19的切片查看是否为时间戳,再根据题意进行模拟排序。去重可以使用哈希集合操作。
正文
preSign
变量来表示上一个数字是加法还是减法即可。由于本题只涉及到加减法,相比起LeetCode上的几道类似题目相对简单(甚至不涉及到出栈操作,只需要考虑入栈即可),要注意遇到等于号
"="
的情况,直接跳过即可。
也可以直接调用
eval()
API,直接根据
"="
对字符串进行切割,将切割后的各个字串传入
eval()
得到各个子串的计算结构,再做求和。
代码
# 题目:【栈】荣耀2023秋招-算式求解
# 作者:闭着眼睛学数理化
# 算法:栈
# 代码有看不懂的地方请直接在群上提问
# 输入字符串
line = input()
stack = list()
# 初始化数字num
num = 0
# 初始化上一个符号preSign
# 1表示"+",-1表示"-"
preSign = 1
# 遍历line中的字符ch
for ch in line:
# 如果ch是数字,则更新num
if ch.isdigit():
num = num * 10 + int(ch)
# 如果ch是符号,则需要把之前得到的num加入stack中
else:
# 根据preSign的正负性,将preSign*num加入stack中
stack.append(preSign*num)
# 重置num为0
num = 0
# 若ch是"+"或"="
# 则设置preSign为1,表示加号
# 这里也可以在遇到"="的时候
# 直接对stack进行求和操作,更加符合对题意的模拟
if ch == "+" or ch == "=":
preSign = 1
else:
preSign = -1
# 退出循环后,还需要把最后一个num加入stack中
stack.append(preSign*num)
# 最终输出stack中所有元素的求和
print(sum(stack))
时空复杂度
时间复杂度:
O(N)
。字符串
line
中的每一个元素仅需遍历一次。
空间复杂度:
O(N)
。栈所占空间。
题目二:找出升序数组中和为给定值的两个数字
题目描述
输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。
如果有多对数字的和等于输入的数字,输出找到的第一对即可。
输入描述
第一行输入一个按升序排序过的整数数组,数组元素不可重复,数组最大不超过
1000
个元素,起始和结束用中括号。
第二行输入一个整数,表示要在第一行数组中要查找的两个数字的和。
输出描述
输出一行三个整数,第一个表示结果是否正常(
0
表示异常或未找到,
1
表示正常),第二个对应找到的数组索引小的数字,第三个对应找到的数组索引大的数字。