Go语言中如何实现栈结构,并解决388.文件最长绝对路径问题?

2026-05-22 05:512阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计639个文字,预计阅读时间需要3分钟。

Go语言中如何实现栈结构,并解决388.文件最长绝对路径问题?

今天在LeetCode上刷题,遇到了388. 文件的路径总和问题,思考了路径的思路,想到了系统的目录是栈结构,果然在题解中找到了栈的解法(强力半天没出来,跑去看了题解了QWQ)。

今天在LeetCode刷每日一题,遇到了388. 文件的最长绝对路径的思路,这道题让我想到了系统的目录是栈结构,果然在题解中找到了栈的解法(暴力半天没出来,跑去看题解了QWQ)。
所以我就捎带复习了一下go语言中栈的实现,然后把这道题给理解一下

go语言栈的实现
  1. 较为简单的实现(通过切片和内置函数)

    func main() { // int类型的栈 stack := make([]int,10) // 压栈 eg.压入1 stack = append(stack,1) // 出栈 stack = stack(:len(stack)-1) }

  2. 看到网上一种。

    使用list(双链表)的部分操作就可以达到stack操作的目的 转自 寇浩哲

    stack := list.New() //初始化栈 ind := stack.Remove(stack.Front()).(int) //出栈 stack.PushFront(i) //入栈 fmt.Println(stack.Front().Value)

388. 文件的最长绝对路径的思路 题解
  1. 为什么要用栈呢?
    因为题目的目录是层级关系,如果遍历到某个目录的最后也没找到文件,肯定要返回到上一级去找另一个目录

    Go语言中如何实现栈结构,并解决388.文件最长绝对路径问题?

  2. /t的多少就是当前目录的层级

  3. 其他操作在注释里很详细了,就不再赘述

    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 } }

标签:最长

本文共计639个文字,预计阅读时间需要3分钟。

Go语言中如何实现栈结构,并解决388.文件最长绝对路径问题?

今天在LeetCode上刷题,遇到了388. 文件的路径总和问题,思考了路径的思路,想到了系统的目录是栈结构,果然在题解中找到了栈的解法(强力半天没出来,跑去看了题解了QWQ)。

今天在LeetCode刷每日一题,遇到了388. 文件的最长绝对路径的思路,这道题让我想到了系统的目录是栈结构,果然在题解中找到了栈的解法(暴力半天没出来,跑去看题解了QWQ)。
所以我就捎带复习了一下go语言中栈的实现,然后把这道题给理解一下

go语言栈的实现
  1. 较为简单的实现(通过切片和内置函数)

    func main() { // int类型的栈 stack := make([]int,10) // 压栈 eg.压入1 stack = append(stack,1) // 出栈 stack = stack(:len(stack)-1) }

  2. 看到网上一种。

    使用list(双链表)的部分操作就可以达到stack操作的目的 转自 寇浩哲

    stack := list.New() //初始化栈 ind := stack.Remove(stack.Front()).(int) //出栈 stack.PushFront(i) //入栈 fmt.Println(stack.Front().Value)

388. 文件的最长绝对路径的思路 题解
  1. 为什么要用栈呢?
    因为题目的目录是层级关系,如果遍历到某个目录的最后也没找到文件,肯定要返回到上一级去找另一个目录

    Go语言中如何实现栈结构,并解决388.文件最长绝对路径问题?

  2. /t的多少就是当前目录的层级

  3. 其他操作在注释里很详细了,就不再赘述

    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 } }

标签:最长