算法之美-每周打卡(每日温度&计算器)

本周的两道编程题都涉及到了栈的应用。第一题LeetCode739-每日温度,通过单调栈找到观测更高气温所需的等待天数;第二题面试题16.26.计算器,使用栈实现简单的算术表达式计算。两题均利用栈的后进先出特性,高效解决实际问题。时间复杂度和空间复杂度均为O(n)。

练习内容:

1.LeetCode739-每日温度

请根据每日气温列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用0来代替。

例如,给定一个列表temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是[1, 1, 4, 2, 1, 1, 0, 0]

题目来自leetcode


单调栈方法:

思路:

列表中必须是单调递增或递减的数值

1.先定义一个stack,再定义一个与栈等长ans
2.遍历列表中的数值,依次放入栈中,将当前的数值与栈顶元素作比较。
3.当弹出的栈顶元素小于当前数值时,放入ans中。

python代码如下:


class Solution:
    def dailyTemperatures(self, T: List[int]) -> List[int]:
        stack = []
        ans = [0] * len(T)
        for t in range(0,len(T)):
            while stack and T[t] > T[stack[-1]]:
                peek = stack.pop(-1)
                ans[peek] = t - peek
            stack.append(t)
        return ans

代码执行后:

每日温度代码执行

时间复杂度: O(n)

空间复杂度: O(n)


2.面试题 16.26. 计算器

给定一个包含正整数、加(+)、减(-)、乘(*)、除(/)的算数表达式(括号除外),计算其结果。
表达式仅包含非负整数,+-*/ 四种运算符和空格。 整数除法仅保留整数部分。
示例 1:

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

示例 2:

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

示例 3:

输入: "3*4 + 5*9/2 + 3"
输出: 37

题目来自leetcode


思路:

利用的特点,将前后两个数值进行四则运算。

1.先定义一个stack,在字符串s末尾设置哨兵。
2.将字符串中的数值放在栈中,优先进行* /运算,弹出的栈顶元素与当前数值进行运算,再加入栈中。
3.+ -运算的数值直接加入栈中,最后将stack中的所有数值加在一起。

python代码如下:

class Solution:
    def calculate(self, s: str) -> int:
        stack =[]
        # 哨兵:在字符串末尾加上特殊符号,设置边界
        s += "@"
        op ="+"
        num = 0
        for i in s:
            if i.isdigit():
                num = num * 10 + int(i)
            elif i == " ":
                continue
            else:
                if op == "@":
                    break
                elif op == "+":
                    stack.append(num)
                elif op =="-":
                    stack.append(-num)
                elif op == "*":
                    stack.append(stack.pop(-1) * num)
                elif op == "/":
                    stack.append(int(stack.pop(-1) / num))
                op = i
                num = 0
        return sum(stack)

代码执行后:

计算器代码执行

时间复杂度:O(n)

空间复杂度:O(n)


总结

本周的两道题都是针对的知识点展开。

栈的特点:

受限制的数据结构,只可以从单方向进行数据的压入或弹出(LIFO),即后进先出


  • 本周两题任务完成
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值