【LeetCode】946. Validate Stack Sequences

更新於 2024/11/24閱讀時間約 7 分鐘

題目

Given two integer arrays pushed and popped each with distinct values, return true if this could have been the result of a sequence of push and pop operations on an initially empty stack, or false otherwise.

範例

Input: pushed = [1,2,3,4,5], popped = [4,5,3,2,1]
Output: true
Explanation: We might do the following sequence:
push(1), push(2), push(3), push(4),
pop() -> 4,
push(5),
pop() -> 5, pop() -> 3, pop() -> 2, pop() -> 1

思路

依照題意,pushed跟popped是兩個整數陣列,內容值不會重複出現。

給一個stack,做完上面陣列的操作流程後,stack是空的就回傳true,反之則回傳false。

  1. pushed陣列內,持續對stack做push(),直到當前數字是popped內最開頭的值,對stack做pop()。

    此時stack=[1, 2, 3, 4] --> stack=[1, 2, 3],popped已用過4,改以下個數字5最為判斷。
  2. 繼續完成pushed陣列內處理,重複上一點邏輯。

解題

Java

class Solution {
public boolean validateStackSequences(int[] pushed, int[] popped) {
Stack<Integer> stack = new Stack<>();
int index = 0;

for (int num: pushed) {
stack.push(num);
while (!stack.isEmpty() && popped[index] == stack.peek()) {
stack.pop();
index++;
}
}
return stack.isEmpty();
}
}

Go

func validateStackSequences(pushed []int, popped []int) bool {
var index int;
stack := make([]int, 0)

for _, num := range pushed {
stack = append(stack, num)
for len(stack) != 0 && stack[len(stack) - 1] == popped[index] {
stack = stack[:len(stack)-1]
index++
}
}

return len(stack) == 0
}

Go_實作Stack

func validateStackSequences(pushed []int, popped []int) bool {
var index int;
stack := NewStack()

for _, num := range pushed {
stack.Push(num)
for !stack.IsEmpty() && stack.Peek() == popped[index] {
stack.Pop()
index++
}
}

return stack.IsEmpty()
}

type Stack struct {
list []int
}

func NewStack() *Stack{
return &Stack{}
}

func (s *Stack) Push(element int) {
s.list = append(s.list, element)
}

func (s *Stack) Pop() {
s.list = s.list[: s.Len() -1]
}

func (s *Stack) IsEmpty() bool{
return s.Len() == 0
}

func (s *Stack) Peek() int {
return s.list[s.Len()-1]
}

func (s *Stack) Len() int {
return len(s.list)
}

反思

Java是我工作上主要使用語言,語法使用相對熟悉,內建提供的資料結構跟API比較能在第一時間提供我解題方向。

用go另外寫一版,一方面是在自學後提升一點語法上的熟練度,一方面是想看看不同語言實作同一件事,呈現出來的結果差異。

在Leetcode上執行結果

    執行時間  記憶體用量
Java   4ms    42.5MB
Go   9ms     3.8MB

另外,go內建slice其實已經可以做到不少功能,額外包裝成Stack看起來只是讓原本的程式碼更接近Java的版本。參閱的網路上其他人寫的Stack,在對應的使用場景保留點優化實作上的彈性,多看看不同的寫法,了解其他實作的差異,不失為一個學習的好方式。

即將進入廣告,捲動後可繼續閱讀
為什麼會看到廣告
avatar-img
13會員
64內容數
遇到的坑、解過的題、新知識的探索、舊時代的遺毒!? 工作後我發現,文件更新往往跟不上新需求的更迭,犯錯的歷史總是不斷重演。因此,我改變了方式,蒐集從程式上、系統上的每一次異常處理過程,好讓再次遇到相同的問題時能快速應變。此專題就是我的錯題本,期待日後不管在工作上或交流上遇到難題,都能輕鬆地應答:有什麼難的,我都踩過。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
Err500 的其他內容
中學以前我並不常做筆記,除了部分老師會以筆記作為打分數的必要要求,勉為其難下才會跟著做點紀錄。高中以後考試範圍急速膨脹,不做點筆記濃縮一下內容,很難在有限的時間內做到多次複習。至於大學...我連原文書都是電子版本或根本沒買。
進入官方網站,根據自己電腦的作業系統,選擇適合的安裝檔。 切記,注意一下基本的配備要求
初玩python時常用pip安裝各式各樣的套件下來,而這些套件在本機中是以全域的方式安裝。假設今天需要接手別人的專案,所用的套件版本不相容,對於這些仰賴的套件(依賴dependencies)進行管理跟切分就成了一個課題。
初學程式時認為寫程式是在跟機器溝通,它懂了、可以動了,我的目的達成了,結案!然而大多時候,光是連編譯器吐出來的錯誤訊息都看不懂,更別說是考慮自己寫出來的程式碼的可讀性,而且專案太小也感覺不出維護上的困難。
連日下雨後得放晴,難得出外透透氣,於是找了鄰近的金面山步道走走。當然,起初我也以為頂多如圖中石梯,大不了是場登階耐力賽。殊不知入口處停了台救護車,途中也遇到兩組救難人馬台者擔架扛傷者下山,原來這路線跟我想的,不一樣!
中學以前我並不常做筆記,除了部分老師會以筆記作為打分數的必要要求,勉為其難下才會跟著做點紀錄。高中以後考試範圍急速膨脹,不做點筆記濃縮一下內容,很難在有限的時間內做到多次複習。至於大學...我連原文書都是電子版本或根本沒買。
進入官方網站,根據自己電腦的作業系統,選擇適合的安裝檔。 切記,注意一下基本的配備要求
初玩python時常用pip安裝各式各樣的套件下來,而這些套件在本機中是以全域的方式安裝。假設今天需要接手別人的專案,所用的套件版本不相容,對於這些仰賴的套件(依賴dependencies)進行管理跟切分就成了一個課題。
初學程式時認為寫程式是在跟機器溝通,它懂了、可以動了,我的目的達成了,結案!然而大多時候,光是連編譯器吐出來的錯誤訊息都看不懂,更別說是考慮自己寫出來的程式碼的可讀性,而且專案太小也感覺不出維護上的困難。
連日下雨後得放晴,難得出外透透氣,於是找了鄰近的金面山步道走走。當然,起初我也以為頂多如圖中石梯,大不了是場登階耐力賽。殊不知入口處停了台救護車,途中也遇到兩組救難人馬台者擔架扛傷者下山,原來這路線跟我想的,不一樣!
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
Leetcode 精選75題 題目與題解 熱門考點 目錄 (持續更新中) 建議從左側目錄 或者 按Ctrl+F輸入關鍵字進行搜尋
Thumbnail
參加Leetcode的30 Days of Pandas挑戰,除了是學習的機會,更是練習熟悉pandas功能的機會。文章分享了挑戰簡介、題目描述、關鍵技術以及參加挑戰的心得。適合新手學習pandas,也可提升熟練度。
題目描述:給一個字串,依照題目給的表格,計算出字串對應的值並做加總 思路:依照題目給的表格做一個字典,接著定義一個變數做加總,並依照題目所給的前一位的值小於當前的值時,做相對應的處理
刷題筆記 Easy 題目說明:總共有 10 根竿子,3 種顏色,給予一 string 名為 rings,Ex: R0G1B2 意思是 第1根( index = 0 )有一個紅戒子,第2根( index = 1)有一個綠戒子,第3根(index = 2)有一個藍戒子 目標:回傳有幾根竿子同時有三個顏
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
Leetcode 精選75題 題目與題解 熱門考點 目錄 (持續更新中) 建議從左側目錄 或者 按Ctrl+F輸入關鍵字進行搜尋
Thumbnail
參加Leetcode的30 Days of Pandas挑戰,除了是學習的機會,更是練習熟悉pandas功能的機會。文章分享了挑戰簡介、題目描述、關鍵技術以及參加挑戰的心得。適合新手學習pandas,也可提升熟練度。
題目描述:給一個字串,依照題目給的表格,計算出字串對應的值並做加總 思路:依照題目給的表格做一個字典,接著定義一個變數做加總,並依照題目所給的前一位的值小於當前的值時,做相對應的處理
刷題筆記 Easy 題目說明:總共有 10 根竿子,3 種顏色,給予一 string 名為 rings,Ex: R0G1B2 意思是 第1根( index = 0 )有一個紅戒子,第2根( index = 1)有一個綠戒子,第3根(index = 2)有一個藍戒子 目標:回傳有幾根竿子同時有三個顏