慕的地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條經驗 獲得超14個贊
我認為你的解決方案過于復雜化了。我不想嘗試調試代碼,而是想提出一種完全不同的思考問題的方式,這有望產生單行分析解決方案。
解讀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
提交
取消