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

news2024/9/22 9:37:37

"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.coloradmin.cn/o/1488808.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

YOLOv8姿态估计实战:训练自己的数据集

课程链接:https://edu.csdn.net/course/detail/39355 YOLOv8 基于先前 YOLO 版本的成功,引入了新功能和改进,进一步提升性能和灵活性。YOLOv8 同时支持目标检测和姿态估计任务。 本课程以熊猫姿态估计为例,将手把手地教大家使用C…

使用TensorRT-LLM进行生产环境的部署指南

TensorRT-LLM是一个由Nvidia设计的开源框架,用于在生产环境中提高大型语言模型的性能。该框架是基于 TensorRT 深度学习编译框架来构建、编译并执行计算图,并借鉴了许多 FastTransformer 中高效的 Kernels 实现,并且可以利用 NCCL 完成设备之…

深入理解nginx的https alpn机制

目录 1. 概述2. alpn协议的简要理解2.1 ssl的握手过程2.2 通过抓包看一下alpn的细节3. nginx源码分析3.1 给ssl上下文设置alpn回调3.2 连接初始化3.3 处理alpn协议回调3.4 握手完成,启用http协议4.4 总结阅读姊妹篇:深入理解nginx的https alpn机制 1. 概述 应用层协议协商(…

大地测量学课堂笔记:1、绪论

慕课网址:https://www.icourse163.org/course/WHU-1464124180?fromsearchPage&outVendorzw_mooc_pcssjg_https://www.icourse163.org/course/WHU-1464124180?fromsearchPage&outVendorzw_mooc_pcssjg_ 1. 大地测量学的定义 大地测量学是专门研究精确测量…

【数据结构】复杂度详解

目录 (一)算法的复杂度 (二)时间复杂度 (1)练笔解释: i,示例1 ii,示例2 iii,二分查找 iv,斐波那契 (三)空间复杂度…

java中的set

Set Set集合概述和特点 不可以存储重复元素 没有索引,不能使用普通for循环遍历 哈希值 哈希值简介 是JDK根据对象的地址或者字符串或者数字算出来的int类型的数值 如何获取哈希值 Object类中的public int hashCode():返回对象的哈希码值。 哈希值的特点 同一个…

【ARM Trace32(劳特巴赫) 高级篇 21 -- SystemTrace ITM 使用介绍】

文章目录 SystemTrace ITMSystemTrace ITM 常用命令Trace Data AnalysisSystemTrace ITM CoreSight ITM (Instrumentation Trace Macrocell) provides the following information: Address, data value and instruction address for selected data cyclesInterrupt event info…

C++基于多设计模式下的同步异步日志系统day5

C基于多设计模式下的同步&异步日志系统day5 📟作者主页:慢热的陕西人 🌴专栏链接:C基于多设计模式下的同步&异步日志系统 📣欢迎各位大佬👍点赞🔥关注🚓收藏,&am…

技术总结: PPT绘图

目录 写在前面参考文档技巧总结PPT中元素的连接立方体调整厚度调整图形中的文本3D 图片调整渐变中的颜色 写在前面 能绘制好一个好看的示意图非常重要, 在科研和工作中好的示意图能精准表达出自己的想法, 减少沟通的成本, 可视化的呈现也可以加强自身对系统的理解, 时间很久后…

Unity 协程(Coroutine)到底是什么?

参考链接:Unity 协程(Coroutine)原理与用法详解_unity coroutine-CSDN博客 为啥在Unity中一般不考虑多线程 因为在Unity中,只能在主线程中获取物体的组件、方法、对象,如果脱离这些,Unity的很多功能无法实现,那么多线程…

python lambda表达式(匿名函数)

lambda 表达式 在Python中,匿名函数(也称为lambda函数)是一种简洁的方式来定义小函数,这些函数可以在需要的地方直接定义和使用,而不需要使用def关键字来定义一个具有名称的函数。 lambda 函数是一种小型、匿名的、内…

vue+element ui上传图片到七牛云服务器

本来打算做一个全部都是前端完成的资源上传到七牛云的demo,但是需要获取token,经历了九九八十一难,最终还是选择放弃,token从后端获取(springboot)。如果你们有前端直接能解决的麻烦记得私我哦!…

学习网络编程No.12【传输层协议之TCP】

引言: 北京时间:2024/2/27/14:12,不知过了多久终于在今天上午更新了新的文章。促使好久没有登录CSDN的我回关了几个近期关注我的人,然后过了没多久有人就通过二维码加了我的微信,他问了我一个问题,如何学好…

【S32DS报错】-7-程序进入HardFault_Handler,无法正常运行

【S32K3_MCAL从入门到精通】合集: S32K3_MCAL从入门到精通https://blog.csdn.net/qfmzhu/category_12519033.html 问题背景: 在S32DS IDE中使用PEmicro(Multilink ACP,Multilink Universal,Multilink FX&#xff09…

3分钟,学会一个测试员必懂 Lambda 小知识!

今天再来给大家介绍下函数式接口和方法引用。 函数式接口 问:Lambda 表达式的类型是什么? 答:函数式接口 问:函数式接口是什么? 答:只包含一个抽象方法的接口,称为函数式接口 (…

【图像版权】论文阅读:CRMW 图像隐写术+压缩算法

不可见水印 前言背景介绍ai大模型水印生成产物不可见水印CRMW 在保护深度神经网络模型知识产权方面与现有防御机制有何不同?使用图像隐写术和压缩算法为神经网络模型生成水印数据集有哪些优势?特征一致性训练如何发挥作用,将水印数据集嵌入到…

MSCKF5讲:后端代码分析

MSCKF5讲:后端代码分析 文章目录 MSCKF5讲:后端代码分析1 初始化initialize()1.1 加载参数1.2 初始化IMU连续噪声协方差矩阵1.3 卡方检验1.4 接收与订阅话题createRosIO() 2 IMU静止初始化3 重置resetCallback()4 featureCallback4.1 IMU初始化判断4.2 I…

YOLOv9独家改进|动态蛇形卷积Dynamic Snake Convolution与RepNCSPELAN4融合

专栏介绍:YOLOv9改进系列 | 包含深度学习最新创新,主力高效涨点!!! 一、改进点介绍 Dynamic Snake Convolution是一种针对细长微弱的局部结构特征与复杂多变的全局形态特征设计的卷积模块。 RepNCSPELAN4是YOLOv9中的特…

【C语言】动态内存管理------常见错误,以及经典笔试题分析,柔性数组【图文详解】

欢迎来CILMY23的博客喔,本篇为【C语言】动态内存管理------常见错误,以及经典笔试题分析,柔性数组【图文详解】,感谢观看,支持的可以给个一键三连,点赞关注收藏。 前言 在了解完内存操作中最关键的一节---动…

怎样裁剪视频上下多余的部分?分享3个裁剪的工具!

在数字时代,视频已成为我们生活中不可或缺的一部分。无论是观看电影、制作个人vlog,还是进行专业的视频编辑,我们时常会遇到需要裁剪视频上下多余部分的情况。那么,如何进行视频裁剪呢?本文将为您详细介绍几种常用的视…