问题给你一堆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 + 1
st 元素。所以你可以访问第一个k - 1
元素和 st k + 1
,但不能访问k
th:
solution = max(max(s[:k - 1]), s[k])
笔记
在这两种情况下,处理k < n
都留给读者作为练习。例如,如果n == 1
,只有当 时才有解k % 2 == 0
,等等。
添加回答
举报
0/150
提交
取消