算法力扣刷题 三十四【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.mfbz.cn/a/777065.html

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

相关文章

图像畸变矫正与透视变换

图像畸变矫正与透视变换 Halcon自动生成的圆形棋盘格Halcon透视变换 Halcon自动生成的圆形棋盘格 示例程序&#xff1a; *生成棋圆形棋盘格 行 列 直径 直径/距离比值 gen_caltab (12, 9, 0.002, 0.5, caltab_12X9.descr, caltab.ps) *生成相机参数 焦距 畸变系数 X解析度 Y解…

计算云服务1

前言 一直以来&#xff0c;计算资源都是整个企业业务系统发展所需的大动脉&#xff0c;没有计算资源&#xff0c;企业业务就无法正常运行。在云计算的时代里&#xff0c;计算服务也是云服务中的第一大类服务&#xff0c;计算资源的重要性由此可见。本章&#xff0c;我们将带领…

【数据结构】常见四类排序算法

1. 插入排序 1.1基本思想&#xff1a; 直接插入排序是一种简单的插入排序法&#xff0c;其基本思想是&#xff1a;把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为止&#xff0c;得到一个新的有序序列 。实际中我们…

HTML5+JavaScript单词游戏

HTML5 JavaScript单词游戏 数据字典格式&#xff1a;每行一个 单词 &#xff0c;单词和解释用空格分隔&#xff0c;如 a art.一(个)&#xff1b;每一(个) ability n.能力&#xff1b;能耐&#xff0c;本领 able a.有能力的&#xff1b;出色的 baby n.婴儿&#xff1b;孩子…

NET程序开发可能会用到的一些资料文档

NET程序开发使用的一些资料文件&#xff0c;NET高级调试&#xff0c;NET关键技术深入解析&#xff0c;WPF专业编程指南&#xff0c;程序员求职攻略&#xff0c;WPF编程宝典等。 下载链接&#xff1a;https://download.csdn.net/download/qq_43307934/89518582

Python入门 2024/7/6

目录 数据容器入门 列表的定义语法 基本语法 嵌套列表 ​编辑 列表的下表索引 ​编辑 列表的常用操作 列表的常见方法 查找元素的下标 修改下标索引的值 插入元素 追加元素 追加一批元素 删除元素 删除某元素在列表中的第一个匹配项 清空列表内容 统计元素在…

【Unity URP】通过代码动态添加URP渲染通道RendererFeature

URP的渲染通道RendererFeature可以很方便的实现一些渲染问题,比如渲染顺序问题,遮挡后的材质替换等等。 那么我们如何通过代码来动态添加和修改呢? 首先我们需要获取到当前的URP配置文件,在对配置文件进行添加 1.通过反射获取当前UniversalRendererData 我们通过Graphic…

Linux:文件系统与日志分析

一、block与inode 1.1、概述 文件是存储在硬盘上的&#xff0c;硬盘的最小存储单位叫做“扇区”(sector)&#xff0c;每个扇区存储512字节。 一般连续八个扇区组成一个"块”(block)&#xff0c;一个块是4K大小&#xff0c;是文件存取的最小单位。 文件数据包括实际数据…

【数据分享】国家级旅游休闲街区数据(Excel/Shp格式/免费获取)

之前我们分享过从我国文化和旅游部官网整理的2018-2023年我国50个重点旅游城市星级饭店季度经营状况数据&#xff08;可查看之前的文章获悉详情&#xff09;&#xff01;文化和旅游部官网上也分享有很多与旅游相关的常用数据&#xff0c;我们基于官网发布的名单文件整理得到全国…

.net 调用海康SDK的跨平台解决方案

📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!📢本文作者:由webmote 原创📢作者格言:新的征程,我们面对的不仅仅是技术还有人心,人心不可测,海水不可量,唯有技术,才是深沉黑夜中的一座闪烁的灯塔序言 上2篇海康SDK使用以及常见的坑…

【JavaEE精炼宝库】文件操作(1)——基本知识 | 操作文件——打开实用性编程的大门

目录 一、文件的基本知识1.1 文件的基本概念&#xff1a;1.2 树型结构组织和目录&#xff1a;1.3 文件路径&#xff08;Path&#xff09;&#xff1a;1.4 二进制文件 VS 文本文件&#xff1a;1.5 其它&#xff1a; 二、Java 操作文件2.1 方法说明&#xff1a;2.2 使用演示&…

第十五章 Nest Pipe(内置及自定义)

NestJS的Pipe是一个用于数据转换和验证的特殊装饰器。Pipe可以应用于控制器&#xff08;Controller&#xff09;的处理方法&#xff08;Handler&#xff09;和中间件&#xff08;Middleware&#xff09;&#xff0c;用于处理传入的数据。它可以用来转换和验证数据&#xff0c;确…

软通动力子公司鸿湖万联最新成果SwanLink AI亮相世界人工智能大会

7月4日&#xff0c;2024世界人工智能大会暨人工智能全球治理高级别会议&#xff08;WAIC 2024&#xff09;在上海拉开帷幕&#xff0c;软通动力董事长兼首席执行官刘天文受邀出席开幕式。其间&#xff0c;软通动力携子公司鸿湖万联深度参与到大会各项活动中&#xff0c;并全面展…

制作Ai 数字人和数字人带货全面拆解复盘

看了后不用再花高价钱去买怎么制作数字人 .数字人带货的相关教程了 市面上基本都是通过这几个方法制作的数字人 超级详细 值得注意的是 拆解的太详细 仅供正规个人用途哦 请勿用于任何非法操作 否则 就不用接着往下看了 点击获取完整版资料

基于图像处理的滑块验证码匹配技术

滑块验证码是一种常见的验证码形式&#xff0c;通过拖动滑块与背景图像中的缺口进行匹配&#xff0c;验证用户是否为真人。本文将详细介绍基于图像处理的滑块验证码匹配技术&#xff0c;并提供优化代码以提高滑块位置偏移量的准确度&#xff0c;尤其是在背景图滑块阴影较浅的情…

R语言fastshap包进行支持向量机shap可视化分析

1995年VAPINK 等人在统计学习理论的基础上提出了一种模式识别的新方法—支持向量机 。它根据有限的样本信息在模型的复杂性和学习能力之间寻求一种最佳折衷。 以期获得最好的泛化能力.支持向量机的理论基础决定了它最终求得的是全局最优值而不是局部极小值,从而也保证了它对未知…

在AvaotaA1全志T527开发板上使用AvaotaOS 部署 Docker 服务

Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中&#xff0c;然后发布到任何流行的 Linux或Windows操作系统的机器上&#xff0c;也可以实现虚拟化。容器是完全使用沙箱机制&#xff0c;相互之间不会有任何接口。 准备…

Maven 分模块设计与开发 继承

介绍 在 Maven 中进行分模块设计&#xff08;multi-module project&#xff09;&#xff0c;可以帮助将一个大型项目分解为更小、更易管理的模块。这种设计方式有助于提高项目的可维护性、复用性和团队协作效率。 继承关系 目录结构 引入父Maven 父坐标 在子项目中引入父亲…

雷电模拟器报错remount of the / superblock failed: Permission denied remount failed

报错截图 解决方法 打开设置 设置配置system.vmdk可写入 解决

【Nginx】docker运行Nginx及配置

Nginx镜像的获取 直接从Docker Hub拉取Nginx镜像通过Dockerfile构建Nginx镜像后拉取 二者区别 主要区别在于定制化程度和构建过程的控制&#xff1a; 直接拉取Nginx镜像&#xff1a; 简便性&#xff1a;直接使用docker pull nginx命令可以快速拉取官方的Nginx镜像。这个过程…