今天在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. 为什么要用栈呢?

    因为题目的目录是层级关系,如果遍历到某个目录的最后也没找到文件,肯定要返回到上一级去找另一个目录

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

栈在go语言中实现,及解决388.文件的最长绝对路径的思路的更多相关文章

  1. C语言中以文本方式读写文件时换行符转换的注意事项

    我们知道在UNIX下是没有回车符(\r)的,只有换行符(\n),而C语言诞生于UNIX(Linux即面向开源的UNIX,Mac OS也是UNIX发展而来的,而Windows是从MS-DOS发展而来,与 ...

  2. C 语言中包含的标准头文件(24个)

    <assert.h><complex.h><ctype.h><errno.h><fenv.h><float.h><intt ...

  3. [LeetCode] Longest Increasing Path in a Matrix 矩阵中的最长递增路径

    Given an integer matrix, find the length of the longest increasing path. From each cell, you can eit ...

  4. C语言中的栈和堆

    原文出处<http://blog.csdn.net/xiayufeng520/article/details/45956305#t0> 栈内存由编译器分配和释放,堆内存由程序分配和释放. ...

  5. C语言中的堆与栈20160604

    首先声明这里说的是C语言中的堆与栈,并不是数据结构中的!一.前言介绍:C语言程序经过编译连接后形成编译.连接后形成的二进制映像文件是静态区域由代码段和数据段(由二部分部分组成:只读数据 段,未初始化数 ...

  6. C语言中堆和栈的区别

    原文:http://blog.csdn.net/tigerjibo/article/details/7423728 C语言中堆和栈的区别 一.前言: C语言程序经过编译连接后形成编译.连接后形成的二进 ...

  7. 关于swift语言中导入OC三方类找不到头文件的解决方法

    首先我遇到的问题是这样的: 我之前封装的OC类,我导入现在的swift工程中,然后建立桥接文件,在Swift的控制器中可以找到这个OC写的东西. 但是问题来了,当你使用cocoapods导入的OC三方 ...

  8. c语言中函数参数入栈的顺序是什么?为什么

    看到面试题C语言中函数参数的入栈顺序如何? 自己不知道,边上网找资料.下面是详细解释 #include <stdio.h> void foo(int x, int y, int z){   ...

  9. 2.C语言中的关键字

    1.auto 修饰局部变量,编译器默认所有局部变量都是用auto来修饰的,所以在程序中很少见到. 2.static 它作用可大了,除了可以修饰变量,还可以修饰函数,修饰变量,改变其作用域和生命周期,修 ...

随机推荐

  1. 数据分析之Pandas操作

    Pandas pandas需要导入 import pandas as pd from pandas import Series,DataFrame import numpy as np 1 Serie ...

  2. numpy入门—numpy是什么

    numpy是什么?为什么使用numpy 使用numpy库与原生python用于数组计算性能对比

  3. Vue2.0一个login跳转实例

    需要解决的问题:store存储登录状态Vue-Router导航钩子拦截路由Vue-Resource获取后台的数据需要判断登录返回的user源码参考原文地址 主要技术栈:Vuex + Vue-Resou ...

  4. zookeeper操作节点代码

    package cn.hbaf.zookeeper_api; import org.apache.curator.RetryPolicy; import org.apache.curator.fram ...

  5. 【uniapp 开发】智能温控开关 (环状图)

    index.vue <template> <view> <view class="qiun-columns"> <uCharts id=& ...

  6. source /etc/profile 不起作用?

    给Linux配置了环境变量,source /etc/profile 完成之后只在当前用户下起作用,切换用户后设置的环境变量竟然没有生效!重启后虽然生效了,但是想知道怎么回事. 找到了如下解答: 假设你 ...

  7. Python入门-面向对象三大特性-封装

    一.封装 封装,顾名思义就是将内容封装到某个地方,以后再去调用被封装在某处的内容. 所以,在使用面向对象的封装特性时,需要: 将内容封装到某处 从某处调用被封装的内容 第一步:将内容封装到某处 sel ...

  8. Spring5-IOC底层原理

    1.什么是IOC (1)控制反转,把对象创建和对象之间的调用过程,交给Spring进行管理 (2)使用IOC目的:为了降低耦合度 2.IOC底层原理 (1)xml解析.工厂模式.反射

  9. Oracle集群 & Grid(rac)配置,反推创建过程(重要)。

    目前机器上,oracle都是安装好的,那么我们怎么知道,之前的安装过程大概是什么样子呢? 大致安装oracle集群的内容: 一.准备和配置: 1.网卡 2.ip资源 3.scanip 4.hosts ...

  10. .NET 6 史上最全攻略

    欢迎使用.NET 6.今天的版本是.NET 团队和社区一年多努力的结果.C# 10 和F# 6 提供了语言改进,使您的代码更简单.更好.性能大幅提升,我们已经看到微软降低了托管云服务的成本..NET ...