当前位置: 首页 > news >正文

leetcode 面试经典 150 题:简化路径

链接简化路径
题序号71
题型字符串
解法
难度中等
熟练度✅✅✅

题目

  • 给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 ‘/’ 开头),请你将其转化为 更加简洁的规范路径。

  • 在 Unix 风格的文件系统中规则如下:
    一个点 ‘.’ 表示当前目录本身。
    此外,两个点 ‘…’ 表示将目录切换到上一级(指向父目录)。
    任意多个连续的斜杠(即,‘//’ 或 ‘///’)都被视为单个斜杠 ‘/’。
    任何其他格式的点(例如,‘…’ 或 ‘…’)均被视为有效的文件/目录名称。

  • 返回的 简化路径 必须遵循下述格式:
    始终以斜杠 ‘/’ 开头。
    两个目录名之间必须只有一个斜杠 ‘/’ 。
    最后一个目录名(如果存在)不能 以 ‘/’ 结尾。
    此外,路径仅包含从根目录到目标文件或目录的路径上的目录(即,不含 ‘.’ 或 ‘…’)。
    返回简化后得到的 规范路径 。

  • 示例 1
    输入:path = “/home/”
    输出:“/home”
    解释:
    应删除尾随斜杠。

  • 示例 2
    输入:path = “/home//foo/”
    输出:“/home/foo”
    解释:
    多个连续的斜杠被单个斜杠替换。

  • 示例 3
    输入:path = “/home/user/Documents/…/Pictures”
    输出:“/home/user/Pictures”
    解释:
    两个点 “…” 表示上一级目录(父目录)。

  • 示例 4
    输入:path = “/…/”
    输出:“/”
    解释:
    不可能从根目录上升一级目录。

  • 示例 5
    输入:path = “/…/a/…/b/c/…/d/./”
    输出:“/…/b/d”
    解释:
    “…” 在这个问题中是一个合法的目录名。

  • 提示
    1 <= path.length <= 3000
    path 由英文字母,数字,‘.’,‘/’ 或 ‘_’ 组成。
    path 是一个有效的 Unix 风格绝对路径。

题型

  1. 核心思想:该题使用栈(Stack)这种数据结构来模拟路径的遍历和回退过程。
  2. 复杂度:时间复杂度是 O(n),其中 n 是路径字符串的长度,因为我们需要遍历整个字符串。空间复杂度也是 O(n),因为我们需要存储路径的有效部分。
  3. c++ 实现算法
class Solution {
public:std::string simplifyPath(std::string path) {std::vector<std::string> stack;//定义一个栈//创建了一个 std::stringstream 对象 ss,并将字符串 path 作为其初始内容。//这样做的目的是为了方便地对路径字符串进行分割和读取操作。std::stringstream ss(path);//dir 用于存储从 stringstream 中读取的每个目录std::string dir;//使用 getline 函数从 stringstream 中按 / 分割读取路径的每个部分,直到没有更多内容可读。while (getline(ss, dir, '/')) {//如果目录为空字符串或为 ".",表示当前目录,不做任何操作,继续下一次循环。if (dir.empty() || dir == ".") {continue;}//如果目录为 "..",表示返回上一级目录。如果栈不为空,则弹出栈顶元素(即移除上一级目录)。else if (dir == "..") {if (!stack.empty()) {stack.pop_back();}}//否则,将该目录压入栈中。 else {stack.push_back(dir);}}//初始化一个空字符串 simplified,用于存储简化后的路径。然后遍历栈中的每个目录,//将其添加到 simplified 字符串中,并在每个目录前加上 /。std::string simplified;for (const std::string& d : stack) {simplified += "/" + d;}//simplified 为空字符串,说明路径简化后是一个根目录,返回 /。否则,返回 simplified。return simplified.empty() ? "/" : simplified;}
};
  1. 算法推演
  • 初始化
    stack:[]
    ss:/a/./b/…/…/c/

  • 遍历路径

    • 读取第一个部分:“”
      空字符串,忽略。
      stack:[]

    • 读取第二个部分:“a”
      将 “a” 压入栈。
      stack:[“a”]

    • 读取第三个部分:“.”
      当前目录,忽略。
      stack:[“a”]

    • 读取第四个部分:“b”
      将 “b” 压入栈。
      stack:[“a”, “b”]

    • 读取第五个部分:“…”
      返回上一级目录,弹出栈顶元素 “b”。
      stack:[“a”]

    • 读取第六个部分:“…”
      返回上一级目录,弹出栈顶元素 “a”。
      stack:[]

    • 读取第七个部分:“c”
      将 “c” 压入栈。
      stack:[“c”]

  • 构建简化后的路径
    初始化 simplified:“”
    遍历栈中的每个目录,将其添加到 simplified 字符串中,并在每个目录前加上 /。
    simplified:“/c”

  • 返回结果
    simplified 不为空,返回 “/c”

  • 最终结果
    简化后的路径为:“/c”

  1. c++ 完整demo
#include <iostream>
#include <vector>
#include <string>
#include <sstream>class Solution {
public:std::string simplifyPath(std::string path) {std::vector<std::string> stack;//定义一个栈//创建了一个 std::stringstream 对象 ss,并将字符串 path 作为其初始内容。//这样做的目的是为了方便地对路径字符串进行分割和读取操作。std::stringstream ss(path);//dir 用于存储从 stringstream 中读取的每个目录std::string dir;//使用 getline 函数从 stringstream 中按 / 分割读取路径的每个部分,直到没有更多内容可读。while (getline(ss, dir, '/')) {//如果目录为空字符串或为 ".",表示当前目录,不做任何操作,继续下一次循环。if (dir.empty() || dir == ".") {continue;}//如果目录为 "..",表示返回上一级目录。如果栈不为空,则弹出栈顶元素(即移除上一级目录)。else if (dir == "..") {if (!stack.empty()) {stack.pop_back();}}//否则,将该目录压入栈中。 else {stack.push_back(dir);}}//初始化一个空字符串 simplified,用于存储简化后的路径。然后遍历栈中的每个目录,//将其添加到 simplified 字符串中,并在每个目录前加上 /。std::string simplified;for (const std::string& d : stack) {simplified += "/" + d;}//simplified 为空字符串,说明路径简化后是一个根目录,返回 /。否则,返回 simplified。return simplified.empty() ? "/" : simplified;}
};int main() {Solution solution;std::string path = "/home//foo/";std::string simplifiedPath = solution.simplifyPath(path);std::cout << "Simplified Path: " << simplifiedPath << std::endl;return 0;
}

相关文章:

leetcode 面试经典 150 题:简化路径

链接简化路径题序号71题型字符串解法栈难度中等熟练度✅✅✅ 题目 给你一个字符串 path &#xff0c;表示指向某一文件或目录的 Unix 风格 绝对路径 &#xff08;以 ‘/’ 开头&#xff09;&#xff0c;请你将其转化为 更加简洁的规范路径。 在 Unix 风格的文件系统中规则如下…...

基于 STM32 的智能农业温室控制系统设计

1. 引言 随着农业现代化的发展&#xff0c;智能农业温室控制系统对于提高农作物产量和质量具有重要意义。该系统能够实时监测温室内的环境参数&#xff0c;如温度、湿度、光照强度和土壤湿度等&#xff0c;并根据这些参数自动调节温室设备&#xff0c;如通风扇、加热器、加湿器…...

【Spring Boot】掌握 Spring 事务:隔离级别与传播机制解读与应用

前言 &#x1f31f;&#x1f31f;本期讲解关于spring 事务传播机制介绍~~~ &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 &#x1f525; 你的点赞就是小编不断更新的最大动力 &#x1f386;那么废话…...

【Postgres_Python】使用python脚本将多个PG数据库合并为一个PG数据库

需要合并的多个PG数据库表个数和结构一致&#xff0c;这里提供一种思路&#xff0c;选择sql语句insert插入的方式进行&#xff0c;即将其他PG数据库的每个表内容插入到一个PG数据库中完成数据库合并 示例代码说明&#xff1a; 选择一个数据库导出表结构为.sql文件&#xff08…...

Tailwind CSS v4.0 发布

Holy shit its actually done &#xff01; 1 月 22 日&#xff0c;Tailwind CSS 正式发布了 4.0 版本&#xff0c;针对性能和灵活性进行了优化&#xff0c;重新构想了配置和定制体验&#xff0c;并充分利用了 Web 平台提供的最新进展。 新的高性能引擎- 完整构建速度提高 5 …...

pandas基础:文件的读取和写入

文件的读取和写入 读取csv文件 csv文件&#xff1a; name,age,city Alice,25,New York Bob,30,Los Angelesread_csv(filename) header&#xff1a;如 何处理文件的第一行。header0将第一行作为列名&#xff0c;headerNone表示文件中没有列名&#xff0c;所有行都是数据。 im…...

【MySQL — 数据库增删改查操作】深入解析MySQL的create insert 操作

数据库CRUD操作 1 CRUD简介 CURD是对数据库中的记录进行基本的增删改查操作: 2. Create 新增 语法 INSERT [INTO] table_name[(column [&#xff0c;column] ...)] VALUES(value_list)[&#xff0c;(value_list)] ... # value 后面的列的个数和类型&#xff0c;要和表结构匹配…...

每日OJ_牛客_小红的子串_滑动窗口+前缀和_C++_Java

目录 牛客_小红的子串_滑动窗口前缀和 题目解析 C代码 Java代码 牛客_小红的子串_滑动窗口前缀和 小红的子串 描述&#xff1a; 小红拿到了一个长度为nnn的字符串&#xff0c;她准备选取一段子串&#xff0c;满足该子串中字母的种类数量在[l,r]之间。小红想知道&…...

HTTP 配置与应用(局域网)

想做一个自己学习的有关的csdn账号&#xff0c;努力奋斗......会更新我计算机网络实验课程的所有内容&#xff0c;还有其他的学习知识^_^&#xff0c;为自己巩固一下所学知识&#xff0c;下次更新HTTP 配置与应用&#xff08;不同网段&#xff09;。 我是一个萌新小白&#xf…...

ultralytics 是什么?

ultralytics 是一个用于计算机视觉任务的 Python 库&#xff0c;专注于提供高效、易用的目标检测、实例分割和图像分类工具。它最著名的功能是实现 YOLO&#xff08;You Only Look Once&#xff09; 系列模型&#xff0c;特别是最新的 YOLOv8。 1. YOLO 是什么&#xff1f; YO…...

AI竞争:从技术壁垒到用户数据之争

标题&#xff1a;AI竞争&#xff1a;从技术壁垒到用户数据之争 文章信息摘要&#xff1a; AI市场呈现开放模型与封闭模型并存的双轨发展态势&#xff0c;但核心竞争力已从模型技术转向用户数据积累和使用习惯培养。商业模式正在多元化发展&#xff0c;从早期的价格战转向subsc…...

MySQL 主从复制(单组传统复制,GTID复制。双主复制)

案例环境 单组复制 master&#xff1a; 192.168.180.143 slave01&#xff1a;192.168.180.144 双组复制 master01&#xff1a;192.168.180.143 master02&#xff1a;192.168.180.144 案例过程 准备工作 关闭所有防火墙 setenforce 0 && systemctl stop firewa…...

python学opencv|读取图像(四十)掩模:三通道图像的局部覆盖

【1】引言 前序学习了使用numpy创建单通道的灰色图像&#xff0c;并对灰色图像的局部进行了颜色更改&#xff0c;相关链接为&#xff1a; python学opencv|读取图像&#xff08;九&#xff09;用numpy创建黑白相间灰度图_numpy生成全黑图片-CSDN博客 之后又学习了使用numpy创…...

vue3 中如何监听 props 中的值的变化

在 Vue 3 中&#xff0c;你可以使用 watch 函数来监听组件的 props 值的变化。watch 函数允许你观察一个或多个响应式数据源&#xff0c;并在这些数据源发生变化时执行回调函数。 以下是一个示例&#xff0c;展示了如何在 Vue 3 中使用 watch 来监听 props 中的值的变化&#…...

Scrapy之一个item包含多级页面的处理方案

目标 在实际开发过程中&#xff0c;我们所需要的数据往往需要通过多个页面的数据汇总得到&#xff0c;通过列表获取到的数据只有简单的介绍。站在Scrapy框架的角度来看&#xff0c;实际上就是考虑如何处理一个item包含多级页面数据的问题。本文将以获取叶子猪网站的手游排行榜及…...

hive 自动检测、自动重启、记录检测日志、自动清理日志

最终效果 定时检测hive运行状态&#xff0c;进程不存在或者进程存在但是不监听端口的hiveserver2&#xff0c;自动重新拉起每次检测脚本执行的日志都会保存在log目录下.check文件&#xff0c;每一个月一个文件每月15日&#xff0c;删除2月前的检测日志开启hive自带日志输出后&…...

HFSS同轴替换波端口

波端口仿真正常 将波端口换成内径内径0.3mm外径0.6mm同轴之后 结果很不对 换成下面的尺寸就好了...

【2024年华为OD机试】 (C卷,100分)- 素数之积(JavaScriptJava PythonC/C++)

一、问题描述 RSA 因数分解问题 题目描述 RSA 加密算法在网络安全世界中无处不在&#xff0c;它利用了极大整数因数分解的困难度。数据越大&#xff0c;安全系数越高。给定一个 32 位正整数&#xff0c;请对其进行因数分解&#xff0c;找出是哪两个素数的乘积。 输入描述 …...

【C++模板】:如何判断自定义类型是否实现某个函数

一、引子 偶尔我们会面对这样的尴尬的场景&#xff0c;我们需要显示的去判断在某个自定义类型中&#xff0c;是否已经提供了我们期待的API接口&#xff0c;以避免产生“莫须有”的错误。阁下该如何破解此问题&#xff01; 这里&#xff0c;直接给出一种通用的方法&#xff0c;…...

基于微信小程序的汽车保养系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...