面试经典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),使用了一个栈和一个字符串数组。栈的空间取决于路径中块的数量,而字符串数组的空间取决于路径中块的数量以及每个块的平均长度。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【王道操作系统】ch1计算机系统概述-06虚拟机

文章目录 【王道操作系统】ch1计算机系统概述-06虚拟机01传统计算机02虚拟机的基本概念(1)第一类虚拟机管理程序(2) 第二类虚拟机管理程序(3) 两类虚拟机管理程序的对比 【王道操作系统】ch1计算机系统概述…

vite打包构建时环境变量(env)生成可配置的js文件

现实需求 在vite开发过程中,一些变量可以放在.env(基础公共部分变量).env.dev(开发环境)、.env.production(生产环境)中管理,通常分成开发和生产两个不同的配置文件管理&#xff0c…

MATLAB环境下基于区域椭圆拟合的细胞分割方法

使用图像分割技术可以找到图像中的目标区域,目标区域可以定义为具有特定值的单个区域,也可以定义为具有相同值的多个区域。目前图像分割已经融入到生活中的方方面面,在遥感领域,它应用于航拍图中的地形、地貌的分割;在…

【d35】【Java】【力扣】28. 找出字符串中第一个匹配项的下标

题目 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。 示例 1: 输入:haystac…

YOLOv8从入门到入土使用教程!(一)训练模型

⭐⭐⭐瞧一瞧看一看,新鲜的YOLOv9魔改专栏来啦!⭐⭐⭐ 专栏介绍:YOLOv9改进系列 | 包含深度学习最新创新,主力高效涨点!!! 一、本文介绍 本文将演示如何使用YOLOv8进行训练及预测! 二…

GitHub登不上:修改hosts文件来解决(GitHub520,window)

参考链接:GitHub520: 本项目无需安装任何程序,通过修改本地 hosts 文件,试图解决: GitHub 访问速度慢的问题 GitHub 项目中的图片显示不出的问题 花 5 分钟时间,让你"爱"上 GitHub。 (gitee.com) GitHub网站…

算法比赛|赛制介绍| ACM, IOI赛制, OI赛制

&#x1f525;博客介绍&#xff1a; 27dCnc &#x1f3a5;系列专栏&#xff1a; <<数据结构与算法>> << 算法入门>> << C项目>> &#x1f3a5; 当前专栏: << 算法入门>> 专题 : 数据结构帮助小白快速入门算法 &#x1f4…

【C++】二叉树进阶面试题(上)

目录 1. 二叉树创建字符串 题目 分析 代码 2. 二叉树的分层遍历1 题目 分析 代码 3. 二叉树的分层遍历2 题目 分析 代码 4. 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先 题目 分析 代码 5. 二叉树搜索树转换成排序双向链表 题目 分析 代码 1. …

鸿蒙开发实战【网络搜索】

概述 本示例通过eTS来展示电话服务中网络搜索功能&#xff0c;包含无线接入技术、网络状态、选网模式、ISO国家码、信号强度信息列表及Radio是否打开。 样例展示 涉及OpenHarmony技术特性 网络通信 基础信息 网络搜索 介绍 本示例通过[ohos.telephony.sim][ohos.telephon…

【算法分析与设计】组合

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;算法分析与设计 ⛺️稳中求进&#xff0c;晒太阳 题目 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 示例 1&…

【笔记版】docker常用指令---systemctl类、docker状态

systemctl [options] docker 启动&#xff1a;system start docker查看状态&#xff1a;systemctl status docker停止&#xff1a;systemctl stop docker有警告&#xff1a;service关闭了&#xff0c;但是docker.socket仍响应解决方法&#xff1a;systemctl stop docker.socket…

如何证明线性规划系统最优解存在性

先给定simplex所对应的算法的流程图: 添加图片注释,不超过 140 字(可选) 上图是线性规划算法的基本流程描述,但是给定的基本流程描述中的一些步骤还需要进一步的进行分解,第一步是如何将线性规划系统依靠算法的步骤现转换为标准型的线性规划系统,然后进行判断,主要是判…

递归实现指数型枚举

题目链接&#xff1a;92. 递归实现指数型枚举 - AcWing题库 解题思路&#xff1a; 递归思想&#xff0c;创建一个长度为n的数组&#xff0c;来存是否取当前的数&#xff0c;1代表取&#xff0c;2代表不取&#xff0c;先取&#xff0c;然后判断下一个数&#xff0c;直到大于n为…

transformer--编码器1(掩码张量、注意力机制、多头注意力机制)

编码器部分: 由N个编码器层堆叠而成每个编码器层由两个子层连接结构组成第一个子层连接结构包括一个多头自注意力子层和规范化层以及一个残差连接。第二个子层连接结构包括一个前馈全连接子层和规范化层以及一个残差连接 掩码张量 什么是掩码张量 掩代表遮掩&#xff0c;码…

【Maven】Maven 基础教程(四):搭建 Maven 私服 Nexus

《Maven 基础教程》系列&#xff0c;包含以下 4 篇文章&#xff1a; Maven 基础教程&#xff08;一&#xff09;&#xff1a;基础介绍、开发环境配置Maven 基础教程&#xff08;二&#xff09;&#xff1a;Maven 的使用Maven 基础教程&#xff08;三&#xff09;&#xff1a;b…

某大型制造企业数字化转型规划方案(附下载)

目录 一、项目背景和目标 二、业务现状 1. 总体应用现状 2. 各模块业务问题 2.1 设计 2.2 仿真 2.3 制造 2.4 服务 2.5 管理 三、业务需求及预期效果 1. 总体业务需求 2. 各模块业务需求 2.1 设计 2.2 仿真 2.3 制造 2.4 服务 2.5 管理 四、…

【前端寻宝之路】总结学习使用CSS的引入方式

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法|MySQL| ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-BNJBIEvpN0GHNeJ1 {font-family:"trebuchet ms",verdana,arial,sans-serif;f…

管家婆订货易在线商城 VshopProcess 任意文件上传漏洞复现

0x01 产品简介 管家婆订货易,帮助传统企业构建专属的订货平台,PC+微信+APP+小程序+h5商城5网合一,无缝对接线下的管家婆ERP系统,让用户订货更高效。支持业务员代客下单,支持多级推客分销,以客带客,拓展渠道。让企业的生意更轻松。 0x02 漏洞概述 管家婆订货易在线商城…

5G网络架构与组网部署01--5G网络架构的演进趋势

目录 1. 5G网络架构的演进趋势 1.1 5G移动通信系统整体架构 1.2 4G移动通信系统整体架构 1.3 4G与5G移动通信系统整体架构对比 1.4 核心网架构演进 1.5 无线接入网演进 1. 整体架构组成&#xff1a;接入网&#xff0c;核心网 2. 5G网络接入网和核心网对应的网元&#xff…

如何本地安装gemma

目录 通过ollama开源软件来一键安装目前主流的大模型&#xff0c;支持的开源模型包括以下内容&#xff1a; https://github.com/ollama/ollama