面试经典150题——简化路径

"A goal is a dream with a deadline." - Napoleon Hill

red white yellow and blue plastic dice

1. 题目描述

image-20240303085628594

2.  题目分析与解析

2.1 思路一

这个题目开始看起来并不太容易知道该怎么写代码,所以不知道什么思路那就先模拟人的行为,比如对于如下测试用例:

首先 /代表根目录,然后向后走,发现 a/,满足规则,继续向后走,发现 ./,其实就是表示当前路径,那说明可以省略,就删除该部分。

继续向后,发现 b/,满足规则,继续向后走,发现 ../,表示当前路径的上一级目录。根据前面走过的步骤,可以知道当前路径为:/a/b,一次回到上一级目录就是 /a

继续向后走,发现还有一个 ../,又需要回到上一级目录,也就是 /

最后发现 c/,说明最终的结果是 /c

而对于如下测试用例:

image-20240303091651821

我们可以发现对于双 /需要特殊处理。

根据以上描述,我们可以粗略的描述一下代码思路:

  1. 定义结果字符串,用一个字符数组最好(方便后续按照块删除)

  2. 遍历path

  3. 截取下一个 /之前的字符

    • 如果发现截取出的是 .,就删除这一小段

    • 如果发现截取出的是 ..,就删除上一个小块的文件地址,比如对于当前路径为 /asad/qwej,如果发现此时截取了 ..,就删除块 /qwej

    • 如果发现是空(对应 // 的情况),就跳过

    • 如果发现是其它字符串,那就在当前块前面加一个 / 然后直接拼接上。(比如当前为/asad/qwej,此时发现对应字符串为 poi,那么就将 "/" + "poi",拼接在/asad/qwej后面形成/asad/qwej/poi

3.2 思路二

既然我们要处理的特殊情况就那么几种:

  1. 出现 .

  2. 出现 ..

  3. 多余的

  4. 正常出现文件路径

那么我们是不是可以

  1. 将1视为什么都不做?

  2. 将2视为减少一个路径

  3. 将3跳过

  4. 将4视为增加一个路径

又因为我们要增加或者减少的哪个路径总是在我们刚刚遍历过的地方,也就是之前的路径我不需要管,相当于先进,后来的内容我要进行判断,相当于后出,那么是不是就可以使用栈来解决?(其实思路和思路一没什么区别,就是把数组换成栈了)

所以根据以上内容我们可以写出如下代码思路:

  1. 定义一个栈

  2. 遍历path

  3. 发现出现 .,对栈保持不动

  4. 发现出现 ..,就弹栈,直到弹出一个 /

  5. 如果发现是空(对应 // 的情况),就跳过

  6. 如果发现是其它字符串,那就在当前块前面加一个 / 然后入栈

3. 代码实现

3.1 思路一

image-20240303095225873

image-20240303095201505

3.2 思路二

image-20240303100824154

image-20240303100755316

4. 相关复杂度分析

思路一:

  • 时间复杂度:O(n),其中 n 是路径字符串的长度。在遍历路径字符串的过程中,执行了一些常数时间的操作,例如字符串拼接、字符串比较等。

  • 空间复杂度:O(n),使用了一个 ArrayList 和一个 StringBuilder。ArrayList 的空间取决于路径中块的数量,而 StringBuilder 的空间取决于路径中每个块的长度。

思路二:

  • 时间复杂度:O(n),其中 n 是路径字符串的长度。首先,通过 split() 方法将路径字符串分割成一个字符串数组,时间复杂度为 O(n)。然后,对字符串数组进行遍历,执行了一些常数时间的操作,例如栈的入栈和出栈操作。

  • 空间复杂度:O(n),使用了一个栈和一个字符串数组。栈的空间取决于路径中块的数量,而字符串数组的空间取决于路径中块的数量以及每个块的平均长度。

综上所述,思路一和思路二的时间复杂度都是线性的,但在空间复杂度上稍有不同。思路一的空间复杂度主要取决于路径中每个块的长度,而思路二的空间复杂度主要取决于路径中块的数量。通常情况下,思路二的空间复杂度略低于思路一。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/506272.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

动态规划(算法竞赛、蓝桥杯)--树形DP树形背包

1、B站视频链接&#xff1a;E18 树形DP 树形背包_哔哩哔哩_bilibili #include <bits/stdc.h> using namespace std; const int N110; int n,V,p,root; int v[N],w[N]; int h[N],to[N],ne[N],tot; //邻接表 int f[N][N];void add(int a,int b){to[tot]b;ne[tot]h[a];h[a…

【嵌入式实践】【芝麻】【设计篇-2】从0到1给电动车添加指纹锁:项目可行性分析

0. 前言 该项目是基于stm32F103和指纹模块做了一个通过指纹锁控制电动车的小工具。支持添加指纹、删除指纹&#xff0c;电动车进入P档等待时计时&#xff0c;计时超过5min则自动锁车&#xff0c;计时过程中按刹车可中断P档状态&#xff0c;同时中断锁车计时。改项目我称之为“芝…

Topaz DeNoise AI:一键让照片重获清晰 mac/win版

Topaz DeNoise AI是一款革命性的图片降噪软件&#xff0c;它利用先进的人工智能算法&#xff0c;帮助用户轻松去除照片中的噪点&#xff0c;恢复图像的清晰度和细节。无论是专业摄影师还是摄影爱好者&#xff0c;Topaz DeNoise AI都能成为他们处理图片时的得力助手。 Topaz De…

CVE-2016-5195 复现记录

文章目录 poc前置知识页表与缺页异常/proc/self/mem的写入流程madvise 漏洞点修复 Dirty COW脏牛漏洞是一个非常有名的Linux竞争条件漏洞&#xff0c;虽然早在2016年就已经被修复&#xff0c;但它依然影响着众多古老版本的Linux发行版&#xff0c;如果需要了解Linux的COW&#…

安装Realtek Audio Driver失败[Error Code:-0001]

安装Realtek Audio Driver失败[Error Code&#xff1a;-0001] 首先来看一下我们遇到的问题GPT4的推荐解决方法&#xff08;流水账&#xff09;笔者自己真实有效的解决办法 首先来看一下我们遇到的问题 描述&#xff1a;在笔记本更新完电脑之后&#xff0c;没有自带声音驱动。然…

GVIM常见命令

一、模式之间的切换 二、退出保存 &#xff1a;q 不保存就退出vim &#xff1a;w 保存但不退出vim &#xff1a;wq 保存并退出vim 三、打开侧边栏 如下所示&#xff1a; 在命令模式下输入vt打开侧边栏目录&#xff0c;输入r更新目录 四、光标的移动 不仅是括号&#xff0c;b…

嵌入式烧录报错:板端IP与PC的IP相同

报错&#xff1a; 配置 实际上我配置并没有错。 服务器IP&#xff08;就是本机&#xff09;、板端IP、网关。此处网关必须与板子IP配套&#xff08;可以不存在&#xff09;。 解决 我网卡配置了多个IP。一番删除添加还是报错。 于是点击服务器IP&#xff0c;换成别的&#x…

2、Linux-系统目录

一、查看系统目录 登录Linux后&#xff0c;执行“cd /”&#xff0c;再执行“ls”或者“ll”可以查看系统目录。 二、解释 Linux系统中的所有文件和目录被组织成从一个根节点开始的树状结构&#xff0c;树的根就是“/”。 1、/&#xff1a;文件系统的根 2、系统相关 boot&a…

CSP-201712-2-游戏

CSP-201712-2-游戏 解题思路 初始化变量&#xff1a;定义整数变量n和k&#xff0c;分别用来存储小朋友的总数和淘汰的特定数字。然后定义了num&#xff08;用来记录当前报的数&#xff09;和peopleIndex&#xff08;用来记录当前报数的小朋友的索引&#xff09;。 初始化小朋…

Java中queue的用法

Java中queue的用法 ​ 在Java中&#xff0c;Queue&#xff08;队列&#xff09;是一种常见的数据结构&#xff0c;它遵循先进先出的原则。Java提供了Queue接口&#xff0c;以及一些实现了该接口的类。常见的实现类包括LinkedList和ArrayDeque。 添加元素 queue.add()实例 //…

PTA L2-006 树的遍历

给定一棵二叉树的后序遍历和中序遍历&#xff0c;请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。 输入格式&#xff1a; 输入第一行给出一个正整数N&#xff08;≤30&#xff09;&#xff0c;是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中…

SD卡数据恢复全攻略,恢复sd卡丢失数据方法

当我们的SD卡&#xff08;Secure Digital Card&#xff09;遭遇数据丢失时&#xff0c;可能会让我们感到焦虑和困惑。不论是意外的删除、格式化&#xff0c;还是由于其他原因导致的数据丢失&#xff0c;恢复这些宝贵的数据都是至关重要的。本文将为你提供一份详尽的SD卡数据恢复…