每日一题(LeetCode)----栈和队列-- 简化路径

每日一题(LeetCode)----栈和队列-- 简化路径

1.题目(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 风格绝对路径。

2.解题思路

思路一:使用栈

1.创建一个栈
2.如果当前栈中有元素
1> 如果当前栈中没有元素,那么将当前遍历到的字符入栈
2>如果当前栈中有元素
1 如果当前遍历到的字符为’/',那么与栈顶元素进行比较

如果栈顶字符也是’/',那么当前遍历到的字符不入栈,继续遍历下一个字符

如果栈顶字符不是’/',那么将当前遍历到的字符入栈,继续遍历下一个字符

2 如果当前遍历到的字符不是’/‘也不是’.',那么将将当前遍历到的字符入栈,继续遍历下一个字符
3 如果当前遍历到的字符是’.‘,我们用一个循环来获取’.‘出现的次数,并在每一次循环中先将’.‘入栈,如果’.‘的下一个不是’/‘(注意这个条件是在字符串有效的范围内生效的)那么继续遍历下一个字符,如果是’/‘就看’.'出现的次数

如果’.‘出现的次数小于等于两次,我们看第一次出现’.‘时,前一个字符是不是’/',

如果不是,那么继续遍历下一个字符

如果是,就看’.'时出现一次还是两次 如果是一次,我们就将栈中元素进行弹出一次

​ 如果是两次,我们就将栈顶弹出三次,然后用一个循环弹出栈顶元素,直到栈顶元素为’/'结束,继续遍历下一个字符(注意如果栈中只有一个元素了,那么不进行弹出操作)

3>创建一个栈,将当前栈中元素放入到新创建的这个栈中
4>创建一个字符串,将新创建的栈的元素一次放到字符串中(注意:当栈中元素不为1时,那我们要对最后一个元素进行一下处理,如果这个元素为’/',我们就不进行放入了)

3.写出代码

思路一的代码

class Solution {
public:string simplifyPath(string path) {int length = path.size();stack<char> sta;for (int i = 0; i < length;) {if (sta.empty()) {sta.push(path[i]);}else {if (path[i] == '/' && sta.top() == '/') {i++;continue;}else if (path[i] == '/' && sta.top() != '/') {sta.push(path[i]);i++;continue;}else if (path[i] != '.' && path[i] != '/') {sta.push(path[i]);i++;}  else{int t = 0;while (path[i] == '.' && i < length) {sta.push(path[i]);i++;t++;}if (path[i] != '/'&&i<length) {continue;}if (t <= 2) {int temp = t;if (temp == 2) {if (path[i - 3] != '/') {continue;}temp++;while (temp != 0 && sta.size() > 1) {sta.pop();temp--;}while (sta.top() != '/' && sta.size() > 1) {sta.pop();}}if (temp == 1) {if (path[i - 2] != '/') {continue;}while (temp != 0) {sta.pop();temp--;}}}}}}string res = "";stack<char> sta2;if (sta.size() == 1) {res+= sta.top();return res;}while (!sta.empty()) {sta2.push(sta.top());sta.pop();}while (!sta2.empty()) {if (sta2.size() == 1 &&sta2.top() == '/') {break;}res += sta2.top();sta2.pop();}return res;}
};

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

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

相关文章

ISO27001认证主要的审核方向

ISO27001审核主要针对组织的信息安全管理体系&#xff08;ISMS&#xff09;进行全面的审查&#xff0c;以确保其符合ISO/IEC 27001标准的要求。审核过程通常包括以下几个方面&#xff1a; 1. 组织环境&#xff1a;审核组织的信息安全管理体系是否能够在组织内部环境以及与外部供…

熟悉DHCP面临的安全威胁与防护机制

一个网络如果要正常地运行&#xff0c;则网络中的主机&#xff08;Host&#xff09;必需要知道某些重要的网络参数&#xff0c;如IP地址、网络掩码、网关地址、DNS服务器地址、网络打印机地址等等。显然&#xff0c;在每台主机上都采用手工方式来配置这些参数是非常困难的、或是…

Springboot学习

Springboot扩展点之InitializingBean-CSDN博客

C/S医院检验LIS系统源码

一、检验科LIS系统概述&#xff1a; LIS系统即实验室信息管理系统。LIS系统能实现临床检验信息化&#xff0c;检验科信息管理自动化。其主要功能是将检验科的实验仪器传出的检验数据经数据分析后&#xff0c;自动生成打印报告&#xff0c;通过网络存储在数据库中&#xff…

《微信小程序开发从入门到实战》学习六十三

6.4 交互API 使用交互API可以在小程序中显示各种弹窗或动画&#xff0c;达到交互反馈的目的。 6.4.1 提示框API 使用wx.showToast接口可显示消息提示框。接口接受Object参。属性如下&#xff1a; title&#xff08;必填&#xff09; 提示的内容 icon …

postgres数据库安装

选择所需数据库版本进行下载 下载地址&#xff1a;PostgreSQL: File Browser 我是以/data当作主目录&#xff0c;所以在/data下创建俩文件夹&#xff0c;默认目录应该是usr mkdir software mkdir module 进入目录&#xff0c;上传下载的gz安装包 cd software rz 解压缩,版本…

6-2 递归求阶乘和

本题要求实现一个计算非负整数阶乘的简单函数&#xff0c;并利用该函数求 1!2!3!...n! 的值。 函数接口定义&#xff1a; double fact( int n ); double factsum( int n ); 函数fact应返回n的阶乘&#xff0c;建议用递归实现。函数factsum应返回 1!2!...n! 的值。题目保证输…

什么是数据资产化?数据怎样成为资产?怎样进入资产负债表?

财政部发布的《企业数据资源相关会计处理暂行规定》将从2024年1月1日起开始实施&#xff0c;为企业数据资源入表提供了基本指引&#xff0c;数据资产化有望迎来爆发期。什么是数据资产化&#xff0c;怎样让数据成为资产&#xff0c;成为了众多国有企业、上市公司关心的问题。 —…

JavaScript 中的双等号(==)和三等号(===)有何不同?何时使用它们?

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;JavaScript篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来JavaScript篇专栏内容:JavaScript-等号区别 目录 和 区别&#xff0c;分别在什么情况使用 一、等于操作符…

交换机端口镜像技术原理与配置

在网络维护的过程中会遇到需要对报文进行获取和分析的情况&#xff0c;比如怀疑有攻击报文&#xff0c;此时需要在不影响报文转发的情况下&#xff0c;对报文进行获取和分析。镜像技术可以在不影响报文正常处理流程的情况下&#xff0c;将镜像端口的报文复制一份到观察端口&…

掌握ElasticSearch(一):Elasticsearch安装与配置、Kibana安装

文章目录 〇、简介1.Elasticsearch简介2.典型业务场景3.数据采集工具4.名词解释 一、安装1.使用docker(1)创建虚拟网络(2)Elasticsearch安装步骤 2.使用压缩包 二、配置1.目录介绍2.配置文件介绍3.elasticsearch.yml节点配置4.jvm.options堆配置 二、可视化工具Kibana1.介绍2.安…

千万别放弃,运维工程师其实是一个被埋没的“朝阳”职位!

运维工程师的出路到底在哪里&#xff1f; 你是不是也常常听到身边的运维人员抱怨&#xff0c;他们的出路到底在哪里呢&#xff1f;别着急&#xff0c;让我告诉你&#xff0c;运维人员就像是IT界的“万金油”&#xff0c;他们像“修理工”一样维修服务器&#xff0c;像“消防员…

springboot(ssm小区团购管理系统 社区团购平台系统 Java系统

springboot(ssm小区团购管理系统 社区团购平台系统 Java系统 开发语言&#xff1a;Java 框架&#xff1a;ssm/springboot vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.7&#xff08;或8.0&#xff09…

说一下 tcp 粘包是怎么产生的?

说一下 tcp 粘包是怎么产生的&#xff1f; TCP粘包是指发送方发送的数据在接收方收到时粘在一起&#xff0c;形成一个大的数据包&#xff0c;而不是按照发送方原始的数据块进行拆分。这可能导致接收方无法正确解析和处理数据。TCP是面向流的协议&#xff0c;它并不保证接收方能…

vue中样式动态绑定写法

绑定样式: class样式 写法:class"xxx"xXX可以是字符串、对象、数组。 字符串写法适用于:类名不确定&#xff0c;要动态获取。 对象写法适用于:要绑定多个样式,个数不确定&#xff0c;名字也不确定。 数组写法适用于:要绑定多个样式&#xff0c;个数确定&#xff0c;…

es 使用笔记

POST /index_topic/_delete_by_query {"query": {"match": {"TopicId": "1739499560356679680"}} }条件删除数据

AI数字人互动大屏采用什么技术?

互动大屏&#xff08;技术支持&#xff1a;zhibo175&#xff09;本身具有令人瞩目的效果&#xff0c;再配置丰富多彩的多媒体&#xff0c;如引人注目的广告、特效或游戏等&#xff0c;可起到很好的引流作用。在空间开阔且客流密集的场所&#xff0c;使用各种形态的大面积屏幕&a…