为了账号安全,请及时绑定邮箱和手机立即绑定

给定堆栈中的最大可能顶部(日产面试问题)

给定堆栈中的最大可能顶部(日产面试问题)

慕的地6264312 2023-10-18 20:55:26
问题给你一堆N整数。在一次操作中,您可以从堆栈中弹出一个元素,也可以将任何弹出的元素推入堆栈。在执行精确操作后,您需要最大化堆栈顶部的元素K。如果执行操作后堆栈变空K,并且没有其他方法使堆栈不为空,则打印 -1。输入格式:输入的第一行由两个空格分隔的整数N和组成K。输入的第二行由N空格分隔的整数组成,表示堆栈的元素。第一个元素代表栈顶,最后一个元素代表栈底。输出格式:执行精确操作后打印堆栈的最大可能顶部元素K。输入:6 41 2 4 3 3 5预期输出:4预期输出的说明:在 3 个操作中,我们删除1, 2, 4,在第四个操作中,我们推4回堆栈。因此,4就是答案。我的代码: def stack_operations(list1, k):    stack = []    list1.reverse()    for number in list1:        stack.append(number)     if k == len(list1) or len(list1) == 1:        print("-1")    elif k > len(list1):        print(max(list1))    else:        list2 = []        for i in range(k - 1):            list2.append(stack.pop())        max_element = max(list2)        print(max_element)n, k = map(int, input().split())num = list(map(int, input().split()))stack_operations(num, k)我的疑问:我的代码适用于示例输入/输出,但它显示所有其他测试用例的运行时错误。我在这里做错了什么?是逻辑错误还是代码错误?问题出在哪里?
查看完整描述

2 回答

?
翻翻过去那场雪

TA贡献2065条经验 获得超13个赞

我认为你的解决方案过于复杂化了。我不想尝试调试代码,而是想提出一种完全不同的思考问题的方式,这有望产生单行分析解决方案。

解读1

在这个版本中,我假设您只能推回最后弹出的元素。

假设问题中有堆栈,存储在 list 中s

s = [1, 2, 4, 3, 3, 5]

如果k = 4,则答案很简单:pop 3,replace 1。这种琐碎的重要之处在于,它向您表明,除非下一个元素大于 中的所有内容,否则s[:k - 1]您必须将自己限制在第一个k - 1元素。但您也无法访问所有这些。例如:

s = [1, 5, 4, 3, 3, 5]

如果出现以下情况,则无法到达5堆栈顶部k = 4:每次获取和替换都是两个操作。因此,这意味着您只能访问最多 的所有其他元素k - 1。换句话说,对于k=4,您可以从x以下标记的元素中进行选择:

s = [x, ., x, ., x, ., ., ., ...]

对于k=5,域如下所示:

s = [., x, ., x, ., x, ., ., ., ...]

希望这种模式相当明显:

solution = max(s[k % 2:k + 1:2])

解读2

在此版本中,我假设您可以推回弹出的任何项目。

再看看k=4

s = [1, 2, 4, 3, 3, 5]

1, 2, 4您可以在前三个 ( ) 操作中弹出k - 1。第四个操作可以是替换其中一项或公开k + 1st 元素。所以你可以访问第一个k - 1元素和 st k + 1,但不能访问kth:

solution = max(max(s[:k - 1]), s[k])

笔记

在这两种情况下,处理k < n都留给读者作为练习。例如,如果n == 1,只有当 时才有解k % 2 == 0,等等。


查看完整回答
反对 回复 2023-10-18
?
RISEBY

TA贡献1856条经验 获得超5个赞

我无法创建评论(抱歉),但“n”未定义。除非当您检查“n == 1”时缺少代码,否则会引发错误。



查看完整回答
反对 回复 2023-10-18
  • 2 回答
  • 0 关注
  • 78 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信