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

简化路径(C++解法)

题目

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

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

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

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

返回简化后得到的 规范路径 。

示例 1:

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

示例 2:

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

示例 3:

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

示例 4:

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

C++代码

#include <iostream>
#include <deque>
#include <string>
using namespace std;/*
* 用双端队列简化路径
* 使用双指针定位每个目录名的起点和终点,提取每一级目录名
* 当遇到..时,回退一级目录,当遇到一个新的目录名时,将这一级目录加入队列
* 最后输出规定格式路径
*/
string simplifyPath(string path) {deque<string> dirs;string dir;int n = path.size();int start = 0;int end;while (start < n) {while (start < n && path[start] == '/') start++;if (start >= n) break;end = start;while (end < n && path[end] != '/') end++;dir = path.substr(start, end - start);if (!dirs.empty() && dir == "..") {dirs.pop_back();}else if (dir != ".." && dir != ".") {dirs.emplace_back(dir);}start = end;}if (dirs.empty()) return "/";string new_path;while (!dirs.empty()) {new_path += "/" + dirs.front();dirs.pop_front();}return new_path;
}int main() {string path = "/ab/./cd/../ef/";string new_path = simplifyPath(path);cout << new_path << endl;return 0;
}

分析

用双端队列简化路径,使用双指针定位每个目录名的起点和终点,提取每一级目录名,当遇到..时,回退一级目录,当遇到一个新的目录名时,将这一级目录加入队列,最后输出规定格式路径。

问题

队列 pop_back():删除尾部元素

emplace_back():尾部插入元素

front():引用双端队列容器的第一个元素

pop_front():删除头部元素

substr():复制子字符串

http://www.lryc.cn/news/207549.html

相关文章:

  • CS224W1.1——图机器学习介绍
  • docker搭建waline评论系统
  • sql server 生成连续日期和数字
  • 太极v14.0.4 免ROOT用Xposed
  • python DevOps
  • Git(四)底层命令:git对象、树对象、提交对象
  • LVS-DR模式+keepalived+nginx+tomcat实现动静分离、负载均衡、高可用实验
  • canvas 状态管理
  • vue中如何给后端过来的数组中每一个对象加一个新的属性和新的对象(不影响后端的原始数据)
  • SpringAOP源码解析之TargetSource(四)
  • Centos7 安装nvidia显卡驱动
  • 22 行为型模式-状态模式
  • Jetpack:018-Jetpack中的导航一
  • Linux常见问题解决操作(yum被占用、lsb无此命令、Linux开机进入命令界面等)
  • 层次式架构的设计理论与实践
  • 【shell】read -t -n1
  • 【嵌入式项目应用】__cJSON在单片机的使用
  • 【智能家居】
  • Android stdio 无法新建或打开AIDL文件(解决方法)
  • 如何进行渗透测试以提高软件安全性?
  • YOLOv5 添加 OTA,并使用 coco、CrowdHuman数据集进行训练。
  • SpringBoot 日志
  • 非小米笔记本小米妙享中心安装最新教程 3.2.0.464 兼容所有Windows系统
  • 基于大数据的社交平台数据爬虫舆情分析可视化系统 计算机竞赛
  • MYSQL(事务)
  • npm start启动的是什么
  • 基于PyTorch的MNIST手写体分类实战
  • conda 复制系统环境
  • 如何在Microsoft Visual Studio 中使用Cpp代码调用python代码
  • DAY35 435. 无重叠区间 + 763.划分字母区间 + 56. 合并区间