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

简化路径(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.kler.cn/a/105398.html

相关文章:

  • FL Studio21.2官方重磅更新及新功能一分钟介绍
  • Android stdio 无法新建或打开AIDL文件(解决方法)
  • 关于高并发你必须知道的几个概念
  • Ubuntu设置允许root用户登录
  • vscode 通过ssh 连接虚拟机vmware(ubuntu)
  • html鼠标悬停图片放大
  • JavaScript中的可变(Mutable)和不可变(Immutable)
  • nodejs+vue购物网站设计系统-计算机毕业设计
  • 代码随想录算法训练营第2天| 977有序数组的平方、209长度最小的子数组。
  • ROS自学笔记十五:URDF工具
  • ChatGPT 与 Python Echarts 完成热力图实例
  • pycharm远程连接Linux服务器
  • centos7系统下,实现1台服务器免密登录多台服务器功能
  • 系统架构设计师之使用McCabe方法可以计算程序流程图的环形复杂度
  • 【设计模式】第5节:创建型模式之“简单工厂、工厂方法和抽象工厂模式”
  • 搜维尔科技:Geomagic Touch X力反馈设备【开箱图真机测试】
  • 【postman】postman的使用与postman汉化
  • 嵌入式系统设计师考试笔记之操作系统基础复习笔记二
  • 爬虫批量下载科研论文(SciHub)
  • Postman笔记