Python编程题21--每日温度

题目

给定一个非空整数列表 temperatures ,该列表依次记录了每日温度,请计算在每一天需要等几天才会有更高的温度,并将结果通过列表返回。

说明:如果气温在这之后都不会升高,请在该位置用 0 来代替。

例如:

给定一个列表:[73, 74, 75, 71, 69, 72, 76, 73],返回结果:[1, 1, 4, 2, 1, 1, 0, 0]

给定一个列表:[30, 25, 35, 32],返回结果:[2, 1, 0, 0]

解释:

[30, 25, 35, 32] 表示该列表记录了4日温度,第 1 日为30,第 2 日为25,第 3 日为35,第 4 日为32 ;

[2, 1, 0, 0] 表示该列表每日需要等几天才会有更高的温度,第 1 日需要等 2 天后温度升高到35,第 2 日需要等 1 天后温度升高到35,第 3、4 日后温度都不会升高,所以都是 0

实现思路1

  • 直接暴力破解
  • 第一层遍历设置当前温度的位置 i,第二层遍历设置当前温度之后的位置 j
  • 每次遍历时寻找出温度升高的下一天,然后通过下标计算得出相差的天数 j - i ,并跳出第二层循环

代码实现

def dailyTemperatures(temperatures):
    res = []
    for i in range(len(temperatures)):
        count = 0
        for j in range(i + 1, len(temperatures)):
            if temperatures[j] > temperatures[i]:
                count += j - i
                res.append(count)
                break
        else:  # for ... else 只有在 for 中全部遍历完,且for中没有因 break 提前跳出循环时才执行else
            res.append(0)
    return res

实现思路2

  • 借助 来实现
  • 用列表 res 表示返回的结果,并设置默认值为 [0] * len(temperatures),用列表 stack 表示栈,其用于存储当前温度的下标 i
  • 第一层 for 遍历 temperatures ,每次遍历都需把当前温度的下标 i 添加到 stack
  • 第二层用 while 循环 stack ,如果非空并且当前温度大于栈顶元素对应的温度,那么执行出栈,直到栈顶元素对应的温度大于当前温度
  • 每次 stack 执行出栈时,可以计算得出当前温度升高所需的天数 i - stack.pop()

代码实现

def dailyTemperatures(temperatures):
    res = [0] * len(temperatures)
    stack = []
    for i, cur in enumerate(temperatures):
        while stack and cur > temperatures[stack[-1]]: 
            index = stack.pop()
            res[index] = i - index
        stack.append(i)
    return res
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章