栈在go语言中实现,及解决388.文件的最长绝对路径的思路
今天在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
}
}
栈在go语言中实现,及解决388.文件的最长绝对路径的思路的更多相关文章
- C语言中以文本方式读写文件时换行符转换的注意事项
我们知道在UNIX下是没有回车符(\r)的,只有换行符(\n),而C语言诞生于UNIX(Linux即面向开源的UNIX,Mac OS也是UNIX发展而来的,而Windows是从MS-DOS发展而来,与 ...
- C 语言中包含的标准头文件(24个)
<assert.h><complex.h><ctype.h><errno.h><fenv.h><float.h><intt ...
- [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 ...
- C语言中的栈和堆
原文出处<http://blog.csdn.net/xiayufeng520/article/details/45956305#t0> 栈内存由编译器分配和释放,堆内存由程序分配和释放. ...
- C语言中的堆与栈20160604
首先声明这里说的是C语言中的堆与栈,并不是数据结构中的!一.前言介绍:C语言程序经过编译连接后形成编译.连接后形成的二进制映像文件是静态区域由代码段和数据段(由二部分部分组成:只读数据 段,未初始化数 ...
- C语言中堆和栈的区别
原文:http://blog.csdn.net/tigerjibo/article/details/7423728 C语言中堆和栈的区别 一.前言: C语言程序经过编译连接后形成编译.连接后形成的二进 ...
- 关于swift语言中导入OC三方类找不到头文件的解决方法
首先我遇到的问题是这样的: 我之前封装的OC类,我导入现在的swift工程中,然后建立桥接文件,在Swift的控制器中可以找到这个OC写的东西. 但是问题来了,当你使用cocoapods导入的OC三方 ...
- c语言中函数参数入栈的顺序是什么?为什么
看到面试题C语言中函数参数的入栈顺序如何? 自己不知道,边上网找资料.下面是详细解释 #include <stdio.h> void foo(int x, int y, int z){ ...
- 2.C语言中的关键字
1.auto 修饰局部变量,编译器默认所有局部变量都是用auto来修饰的,所以在程序中很少见到. 2.static 它作用可大了,除了可以修饰变量,还可以修饰函数,修饰变量,改变其作用域和生命周期,修 ...
随机推荐
- Django的多数据库与读写分离
1.多个数据库 settings.py DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.pa ...
- 学习Apache(一)
实验目的 通过apache实现反向代理的功能,类似nginx反向代理和haproxy反向代理 环境准备 逻辑架构如下 前端是apche服务器,监听80端口,后端有两台web服务器,分别是node1和n ...
- 学习saltstack (六)
Slatstack 介绍 官网:https://saltstack.com/ 官方源:http://repo.saltstack.com/ (介绍各操作系统安装方法) centos 6源 ? 1 y ...
- 前馈控制+PID
参考来源: 北京交通大学 硕士学位论文 基于脉冲串控制的含位置反馈和前馈补偿的位置控制算法的研究 赵旺升
- 记离线缓存(manifest)一大坑,断定其只适用于静态网站或离线应用
今天看了离线缓存(manifest)方面的资料,兴冲冲地就想给自己的网站用上.待我把代码都写好部署上服务器,并测试过OK的时候,在SegmentFault刷了一把manifest方面的问答,才发现这个 ...
- jq easyui数据网络的分页过程
第一次写技术方面的文章,有点忐忑,总怕自己讲的不对误导别人.但是万事总有个开头,有不足错误之处,请各位读者老爷指出. 言归正传,最近刚进新公司,上头要求我先熟悉熟悉easyui这个组件库.在涉及到da ...
- github 上有趣又实用的前端项目(持续更新,欢迎补充)
github 上有趣又实用的前端项目(持续更新,欢迎补充) 1. reveal.js: 幻灯片展示框架 一个专门用来做 HTML 幻灯片的框架,支持 HTML 和 Markdown 语法. githu ...
- Unknown host mirrors.opencas.cn You may need to adjust the proxy settings in Gradle 报错及解决办法
亲测Unknown host mirrors.opencas.cn You may need to adjust the proxy settings in Gradle 解决办法 - 程序员大本营 ...
- CCF201312-2ISBN号码
问题描述 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字.1位识别码和3位分隔符,其规定格式如"x-xxx-xxxxx-x",其中符号"-&qu ...
- javascript回调地狱真的只能Promise来解决吗?js回调地狱,Promise。
javascript的灵活在于函数可以当作函数的参数来传递,以及它的异步回调思想.但是这就带了一个很严重的问题,那就是回调次数过多,会影响代码结构,多层嵌套影响代码的可阅读性,也不便于书写. 举个例子 ...