算法力扣刷题 三十四【71.简化路径】

前言

栈和队列篇。
记录 三十四【71.简化路径】


一、题目阅读

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

在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (…) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。任意多个连续的斜杠(即,‘//’)都被视为单个斜杠 ‘/’ 。 对于此问题,任何其他格式的点(例如,‘…’)均被视为文件/目录名称。

请注意,返回的规范路径 必须遵循下述格式:

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

示例 1:

输入:path = "/home/"
输出:"/home"
解释:注意,最后一个目录名后面没有斜杠。 

示例 2:

输入:path = "/../"
输出:"/"
解释:从根目录向上一级是不可行的,因为根目录是你可以到达的最高级。

示例 3:

输入:path = "/home//foo/"
输出:"/home/foo"
解释:在规范路径中,多个连续斜杠需要用一个斜杠替换。

示例 4:

输入:path = "/a/./b/../../c/"
输出:"/c"

提示:

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

二、尝试实现

思路

(1)遍历path,遇到不是“/”,开始找该文件名称。两层for循环;
(2)定义一个栈,先把根目录“/”,放进去。
(3)push文件名还想直接处理间隔斜杠“/”。
(4)获取文件名,如果path最后不是“/”结尾,还要额外处理最后的文件名。
(5)最后,希望直接弹出栈的内容,包含间隔斜杠“/”,能够return result。
总结:思路没问题,但是操作上很麻烦。修改很多次,总有用例无法测试。

代码

不完善的代码

class Solution {
public:string simplifyPath(string path) {string result;//返回值stack<string> st;//最高层是根目录string substr;//先在st里面放上根目录“/”st.push("/");	//从下标1开始遍历,跳过根目录。for(int i = 1;i < path.size();i++){if(path[i] == '/'){	continue;}else{	//遇到不是斜杠,开始找文件名int j = i+1;	//从下一位开始。//本应该看什么时候遇到“/”,break循环;但是如果不是以“/”结尾,还得处理(细节一);for(;j < path.size();j++){if(path[j] == '/'){	substr = path.substr(i,j-i);break;}else if(j == path.size()-1 && path[j] != '/'){	//还有漏洞:如果i==path.size-1,j超出范围无法进去循环,substr还是上一次文件名,会重复放入。substr = path.substr(i,j-i+1);}}//放入substr。if(!substr.empty()&& substr == ".." && st.size() > 1){	//为了不让根目录pop,需要size>1。每次情况,可能访问空字符串,所以!substr.empty()。st.pop();}else if(!substr.empty()&& substr != ".." && substr != "."){if(j < path.size()-1){	//检查要不要加“/”substr += "/";}st.push(substr);}i = j;substr.clear();//每次得substr清空。对应上面的漏洞,需要清空。}}while(!st.empty()){if(result.empty() && st.size() > 1 && st.top().back() == '/'){int pos  = st.top().size()-1;st.top().erase(pos);}string temp = st.top();result = temp + result;st.pop();}return result;}
};

所以:拆东墙补西墙的,始终完善不好。


三、更新思路

正确处理

(1)st只记录有效文件名,先不处理间隔斜杠“/”,等循环pop时再加上“/”。
(2)先对path后面加上“/”,这样无需额外处理最后字段,统一判断是否遇到“/”。统一了判断标准。
(3)for循环只用一个i下标。

代码实现

正确代码:

class Solution {
public:
string simplifyPath(string path) {string result;//返回值stack<string> st;string substr = "";//放有效文件名path += "/";	//path最后都先加上“/”//只记录文件名,放到st中。斜杠暂时不处理for(int i = 0;i < path.size();i++){if(path[i] != '/'){		//遇到不是“/”,开始统计,用substr放substr += path[i];continue;}else if(substr == ".." && !st.empty()){	st.pop();}else if(substr != ".." && substr != "." && substr != ""){	//如果path[i] == "",此处会把空字符串放到st里面,结果不对。不等于空也是必要条件st.push(substr);}substr.clear();	//每一个有效文件名处理之后,都要清空}while(!st.empty()){	//倒着往前连接有效文件名。在这里处理“/”string temp = st.top();result = temp+result;result = "/"+result;st.pop();}return result.empty()? "/":result;	//如果st是空,没有有效文件名,返回根目录。}};

总结

简化路径方法:

  • 先在path后面加“/”,统一文件名的判断。不额外处理最后如果没有加“/”的情况,类似链表中用虚拟头节点。
  • st只记录有效文件名,不处理间隔“/”。
  • 连接路径时,在处理“/”。
  • 如果result为空,有效文件名是空,那么返回根目录。

(欢迎指正,转载标明出处)

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

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

相关文章

3-2 梯度与反向传播

3-2 梯度与反向传播 主目录点这里 梯度的含义 可以看到红色区域的变化率较大&#xff0c;梯度较大&#xff1b;绿色区域的变化率较小&#xff0c;梯度较小。 在二维情况下&#xff0c;梯度向量的方向指向函数增长最快的方向&#xff0c;而其大小表示增长的速率。 梯度的计算 …

使用Python实现深度学习模型:模型解释与可解释人工智能

在深度学习领域,模型解释和可解释性人工智能(XAI)正变得越来越重要。理解深度学习模型的决策过程对于提高模型的透明度和可信度至关重要。本文将详细介绍如何使用Python实现模型解释和可解释性人工智能,包括基本概念、常用方法、代码实现和示例应用。 目录 模型解释与可解…

docker使用镜像jms_all部署jumpserver

创建容器需要挂载出来的服务器对应目录 mkdir -p /data/redis/data mkdir -p /opt/mysql/{data,conf,logs}docker安装redis docker run -d -it --name redis -p 6379:6379 -v /data/redis/data:/data --restart=always

如何第一次从零上传项目到GitLab

嗨&#xff0c;我是兰若&#xff0c;今天想给大家说下&#xff0c;如何上传一个完整的项目到与LDAP集成的GitLab&#xff0c;也就是说这个项目之前是不在git上面的&#xff0c;这是第一次上传&#xff0c;这样上传上去之后&#xff0c;其他小伙伴就可以根据你这个项目的git地址…

3. train_encoder_decoder.py

train_encoder_decoder.py #__future__ 模块提供了一种方式&#xff0c;允许开发者在当前版本的 Python 中使用即将在将来版本中成为标准的功能和语法特性。此处为了确保代码同时兼容Python 2和Python 3版本中的print函数 from __future__ import print_function # 导入标准库…

Lua语言入门

目录 Lua语言1 搭建Lua开发环境1.1 安装Lua解释器WindowsLinux 1.2 IntelliJ安装Lua插件在线安装本地安装 2 Lua语法2.1 数据类型2.2 变量全局变量局部变量命名规范局部变量作用域 2.3 注释单行注释多行注释 2.4 赋值2.5 操作符数学操作符比较操作符逻辑操作符连接操作符取长度…

Leetcode秋招冲刺--(专题7-9)

专题7&#xff1a;字符串匹配 题目459:重复的子字符串&#xff08;NO&#xff09; 解题思路&#xff1a;这里用到了substr获取子串&#xff0c;然后直接堆成相同大小的主串&#xff0c;然后进行比较。 这题主要没做出的原因是时间复杂度一直优化不下去 myself class Soluti…

定个小目标之刷LeetCode热题(41)

338. 比特位计数 给你一个整数 n &#xff0c;对于 0 < i < n 中的每个 i &#xff0c;计算其二进制表示中 1 的个数 &#xff0c;返回一个长度为 n 1 的数组 ans 作为答案。 今天看一下这道简单题&#xff0c;主要考查位运算&#xff0c;代码如下 class Solution {pu…

Vue3路由切换动画

一、安装依赖 需要安装animate.css pnpm i animate.css二、使用transition添加过渡动画 注意&#xff1a;要想使用动画&#xff0c;需要加:key <router-view v-slot"{ Component }"><Transitionappearenter-active-class"animate__animated animate__f…

moonlight+sunshine+ParsecVDisplay ipad8-windows 局域网串流

1.sunshine PC 安装 2.设置任意账户密码登录 3.setting 里 network启用UPNP IPV4IPV6 save apply 4.ParsecVDisplay虚拟显示器安装 5.ipad appstore download moonlight 6.以ipad 8 为例 2160*1620屏幕分辨率 7.ParsecVDisplay里面 custom设置2160*1620 240hz&#xff0c;…

银河麒麟V10 SP1 审计工具 auditd更新

前言 银河麒麟V10 SP1 审计工具 auditd 引发的内存占用过高&#xff0c; 内存使用率一直在 60% 以上&#xff0c; 内存一直不释放 排查 可以使用ps或者top查看系统进程使用情况 ps -aux|sort -k4nr|head -n 5 发现银河麒麟审计工具 auditd 一直占用内存不释放 解决 办法一…

vivado CLOCK_REGION、CLOCK_ROOT

时钟区域 CLOCK_REGION属性用于将时钟缓冲区分配给 UltraScale设备&#xff0c;同时让Vivado放置程序将时钟缓冲区分配给最佳站点 在该区域内。 重要提示&#xff1a;对于UltraScale设备&#xff0c;不建议将时钟缓冲区固定到特定站点&#xff0c;因为 你可以在时钟上规划一个7…

(头哥)Hive的安装与配置

第1关&#xff1a;Hive的安装与配置 wget -O - https://gitee.com/tianzhen2647/bash/raw/master/Hive%E7%9A%84%E5%AE%89%E8%A3%85%E4%B8%8E%E9%85%8D%E7%BD%AE/h1.sh | bash第2关&#xff1a;Hive Shell入门基础命令 直接修改/opt/hive/bin下的hive文件&#xff0c;把里面的…

掌握Eloquent ORM:Laravel中的对象关系映射艺术

掌握Eloquent ORM&#xff1a;Laravel中的对象关系映射艺术 在现代Web应用开发中&#xff0c;数据库的操作是核心功能之一。Laravel框架提供了一个强大而优雅的ORM&#xff08;对象关系映射&#xff09;工具——Eloquent。Eloquent让数据库操作变得简单直观&#xff0c;同时保…

进程的初步认识

目录 一、硬件方面介绍 1.冯诺依曼体系结构 2.存储分级 二、软件 方面 1.操作系统是一款进行管理的软件&#xff0c;它可以管理硬件也可以管理软件 2.操作系统如何管理&#xff1f; 三、进程 1.概念 总结 四、linux中对进程的管理 1.task_ struct内容分类 2.查看进…

现代信息检索笔记(四)——文档评分、词项权重计算及向量空间模型

目录 对搜索结果进行排序 目标 方案一&#xff1a;jaccard系数 方案二&#xff1a;tf-idf公式 长文本长度 向量空间模型小结 对搜索结果进行排序 排序式检索&#xff0c;如何高速求相关性R 目标 无关的不在上面相关度高的在前面 在链表中不出现的相关性为0&#xff0c…

PageCache页缓存

一.PageCache基本结构 1.PageCache任务 PageCache负责使用系统调用向系统申请页的内存,给CentralCache分配大块儿的内存,以及合并前后页空闲的内存,整体也是一个单例,需要加锁. PageCache桶的下标按照页号进行映射,每个桶里span的页数即为下标大小. 2.基本结构 当每个线程的…

如何使用uer做多分类任务

如何使用uer做多分类任务 语料集下载 找到这里点击即可 里面是这有json文件的 因此我们对此要做一些处理&#xff0c;将其转为tsv格式 # -*- coding: utf-8 -*- import json import csv import chardet# 检测文件编码 def detect_encoding(file_path):with open(file_path,…

Vatee万腾平台:智能生活的新选择

在科技飞速发展的今天&#xff0c;智能生活已经不再是遥不可及的梦想&#xff0c;而是逐渐渗透到我们日常生活的方方面面。Vatee万腾平台&#xff0c;作为智能科技领域的佼佼者&#xff0c;正以其创新的技术、丰富的应用场景和卓越的用户体验&#xff0c;成为智能生活的新选择&…

dc/dc_shell的keep和donot touch区别

donot touch和keep的区别 在半导体设计和综合工具中&#xff0c;donottouch 和 keep 属性通常用于指定综合和布局阶段的特定要求。sizeonly 是 keep 属性的一个可能值。以下是 donottouch 和 keep 属性以及 sizeonly 的区别和用途&#xff1a; donottouch&#xff1a; donotto…