棧在go語言中的實現,及解決LeetCode題目388. 檔案的最長絕對路徑的思路
阿新 • • 發佈:2022-04-20
今天在LeetCode刷每日一題,遇到了388. 檔案的最長絕對路徑的思路,這道題讓我想到了系統的目錄是棧結構,果然在題解中找到了棧的解法(暴力半天沒出來,跑去看題解了QWQ)。
所以我就捎帶複習了一下go語言中棧的實現,然後把這道題給理解一下
go語言棧的實現
-
較為簡單的實現(通過切片和內建函式)
func main() { // int型別的棧 stack := make([]int,10) // 壓棧 eg.壓入1 stack = append(stack,1) // 出棧 stack = stack(:len(stack)-1) }
-
看到網上一種。
使用list(雙鏈表)的部分操作就可以達到stack操作的目的
stack := list.New() //初始化棧 ind := stack.Remove(stack.Front()).(int) //出棧 stack.PushFront(i) //入棧 fmt.Println(stack.Front().Value)
388. 檔案的最長絕對路徑的思路 題解
-
為什麼要用棧呢?
因為題目的目錄是層級關係,如果遍歷到某個目錄的最後也沒找到檔案,肯定要返回到上一級去找另一個目錄 -
/t的多少就是當前目錄的層級
-
其他操作在註釋裡很詳細了,就不再贅述
func lengthLongestPath(input string) int { stack := []int{} l := len(input) ans := 0 for i := 0;i < l;i++ { index := 1 // 遇到/t遍歷有幾個/t 增加深度(一個/t相當於一級目錄) for ;i < l&& input[i] == '\t';i++ { index++ } length := 0 isExt := 0 // 遍歷當前目錄長度 for ;i < l&& input[i] != '\n';i++{ if input[i] == '.' { isExt = 1 } length++ } // 如果當前深度小於棧裡的目錄級數,說明棧裡的目錄已經到底了,需要退棧 for index <= len(stack) { stack = stack[:len(stack)-1] } // 如果不是第一級目錄,那麼就要多算一個/的長度,同時要把上一級的長度加到length裡 if len(stack) > 0{ length += stack[len(stack)-1] + 1 } //如果isExt == 1 說明已經找到檔案,判斷一下是不是最長的,如果不等於,把當前目錄長度給壓棧裡,方便下一次加到length裡 if isExt == 1{ ans = max(ans,length) }else { stack = append(stack,length) } } return ans } func max(a int,b int) int { if a > b { return a }else { return b } }