以 Unix 风格给出一个文件的绝对路径,你需要简化它。或者换句话说,将其转换为规范路径。

在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (..) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。更多信息请参阅:Linux / Unix中的绝对路径 vs 相对路径

请注意,返回的规范路径必须始终以斜杠 / 开头,并且两个目录名之间必须只有一个斜杠 /。最后一个目录名(如果存在)不能以 / 结尾。此外,规范路径必须是表示绝对路径的最短字符串。

示例 1:

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

示例 2:

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

示例 3:

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

示例 4:

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

示例 5:

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

示例 6:

输入:"/a//bc/d//././/.."
输出:"/a/b/c"
 1 #include "_000库函数.h"
 2
 3
 4 //一开始不知道从何下手
 5 //感觉是用栈,所以用vector来代替栈
 6
 7 class Solution {
 8 public:
 9     string simplifyPath(string path) {
10         vector<string>v;
11         string s = "";//用来记录临时路径
12         int n = 0;//记录‘.’的个数
13         for (int i = 0; i < path.size(); ++i) {
14             if (path[i] == '.')
15                 ++n;
16             else if (path[i] != '/') {//记录次级目录
17                 s.insert(s.end(), n, '.');//防止有些目录名是以.开头!!
18                 n = 0;
19                 s += path[i];
20             }
21             else {//path[i] == '/'
22                 if (n > 2)
23                     s.insert(s.end(), n, '.');
24                 else if (n == 2 && !v.empty())//确保不是在根目录
25                     v.pop_back();// 跳到上一级
26
27                 n = 0;
28                 if (s.size() > 0)
29                     v.push_back(s);
30                 s = "";
31             }
32
33         }
34         if (n > 2)
35             s.insert(s.end(), n, '.');
36         else if (n == 2 && !v.empty())//确保不是在根目录
37             v.pop_back();// 跳到上一级
38         if (s.size() > 0)
39             v.push_back(s);
40         s = "";
41         for (int i = 0; i < v.size(); ++i)//之所以从1开始,是去除根目录的‘/’
42             s = s + "/" + v[i];
43         if (!s.empty())return s;
44         return "/";
45     }
46 };
47
48 //C++中有专门处理字符串的机制,我们可以使用stringstream来分隔字符串,
49 //然后对每一段分别处理,思路和上面的方法相似,参见代码如下:
50 //
51
52 class Solution {
53 public:
54     string simplifyPath(string path) {
55         string res, t;
56         stringstream ss(path);
57         vector<string> v;
58         while (getline(ss, t, '/')) {
59             if (t == "" || t == ".") continue;
60             if (t == ".." && !v.empty()) v.pop_back();
61             else if (t != "..") v.push_back(t);
62         }
63         for (string s : v) res += "/" + s;
64         return res.empty() ? "/" : res;
65     }
66 };
67
68
69
70 void T071() {
71     Solution s;
72     string str;
73     str = "/home/";
74     cout << "输入:" << str << endl << "输出:" << s.simplifyPath(str) << endl;
75     str = "/../";
76     cout << "输入:" << str << endl << "输出:" << s.simplifyPath(str) << endl;
77     str = "/home//foo/";
78     cout << "输入:" << str << endl << "输出:" << s.simplifyPath(str) << endl;
79     str = "/a/./b/../../c/";
80     cout << "输入:" << str << endl << "输出:" << s.simplifyPath(str) << endl;
81     str = "/a/../../b/../c//.//";
82     cout << "输入:" << str << endl << "输出:" << s.simplifyPath(str) << endl;
83     str = "/a//bc/d//././/..";
84     cout << "输入:" << str << endl << "输出:" << s.simplifyPath(str) << endl;
85     str = "/...";
86     cout << "输入:" << str << endl << "输出:" << s.simplifyPath(str) << endl;
87
88 }

转载于:https://www.cnblogs.com/zzw1024/p/10701397.html

力扣算法题—071简化路径相关推荐

  1. 程序员面试需要刷力扣算法题吗

    这里写目录标题 1. 程序员面试需要刷力扣算法题吗 1.1. 算法题的一些特征 1.2. 为什么要考查算法 1.3. 目前面试主要考查 3 类 1. 程序员面试需要刷力扣算法题吗 1.1. 算法题的一 ...

  2. LeetCode -- 力扣算法题解题心得 -- (个人笔记记录)持续更新~~

    一.前言 正式开启数据结构+算法研究的历程,准备好一年后的面试.下面的解法不一定是最优解,只求能力提升,会定期更新~~ 二.目录 1 2 19 20 21 24 35 42 83 86 94 96 1 ...

  3. 力扣算法题—042接雨水

    1 #include"000库函数.h" 2 //一点头绪都没有 3 //然后就自己按自己的意思来一遍 4 //好像没有用算法 5 //16ms,让我激动一把 6 7 class ...

  4. “宝石与石头”:一道简单却巧妙的力扣算法题

    本篇博客会讲解力扣"771. 宝石与石头"的解题思路,这是题目链接. 先来审题: 以下是输出示例: 以下是提示: 本题可以使用数组模拟哈希表来实现.先把宝石字符串中的字符标识到数组 ...

  5. 力扣算法题-19.秋叶收藏集 C语言实现

    题目 小扣出去秋游,途中收集了一些红叶和黄叶,他利用这些叶子初步整理了一份秋叶收藏集 leaves, 字符串 leaves 仅包含小写字符 r 和 y, 其中字符 r 表示一片红叶,字符 y 表示一片 ...

  6. 力扣算法题,第N个神奇数字(Python)

    878.第N个神奇数字 题目描述: 一个正整数如果能被 a 或 b 整除,那么它是神奇的. 给定三个整数 n , a , b ,返回第 n 个神奇的数字.因为答案可能很大,所以返回答案 对 109 + ...

  7. 力扣算法题—075颜色分类

    给定一个包含红色.白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色.白色.蓝色顺序排列. 此题中,我们使用整数 0. 1 和 2 分别表示红色.白色和蓝色. ...

  8. 力扣算法题—073矩阵置零

    给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0.请使用原地算法. 示例 1: 输入: [[1,1,1],[1,0,1],[1,1,1] ] 输出: [[1,0, ...

  9. 力扣算法题—074搜索二维矩阵

    编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值.该矩阵具有如下特性: 每行中的整数从左到右按升序排列. 每行的第一个整数大于前一行的最后一个整数. 示例 1: 输入: matrix ...

最新文章

  1. python ftp文件传输服务端
  2. OVS之vhost-net中VM通信(九)
  3. OpenGL教程——GLUT初始化
  4. 使用SAP HANA Web-based Development Workbench进行SQLScript练习
  5. android browser 书签 路径,Android Browser学习七 书签历史模块: 书签UI的实现(2)
  6. [深度学习] 分布式Pytorch介绍(三)
  7. poj 1904 King's Quest 强连通分量+匹配
  8. leetcode784题:字母大小写全排列
  9. Windows 7 With SP1 MSDN版 含简体中文版
  10. pytorch 生成随机数Tensor的方法 torch.rand torch.randn torch.normal torch.linespace
  11. db_cxx.h: No such file or directory
  12. 法律咨询小程序开发制作(律师事务所小程序)
  13. 增量学习(Incremental Learning)小综述
  14. STM32 SPI 主模式下配置(神州三号开发板spi.c解析上)
  15. STM8单片机低功耗---活跃停机(Active Halt)模式实现-2
  16. 有益视力的食疗方法(转载)
  17. 小程序实现身份证取景框拍摄-uniapp版
  18. Java项目开发如何设计整体架构
  19. ale插件 vim_Vim中异步语法检查ale配置
  20. php繁体网站配置,php网页是繁体字怎么办

热门文章

  1. python自动化办公模块_Python 自动化办公之 Excel 模块 — openpyxl 的基本使用!
  2. cesium 原生抛物线
  3. ipad python编程软件_在iPad中运行Python
  4. acs712电流检测怎么用_工程师都用这个巧妙廉价的电流检测电路!
  5. Java equalsIgnoreCase() 方法
  6. js 键盘事件 理解
  7. jdbc如何使用oracle数据库连接池,使用JDBC连接池技术连接Oracle数据库
  8. 接口带声音输出吗_智能化时代,你的功放跟得上科技的脚步吗?
  9. 江苏省2021年高考成绩查询有分数吗,2021年江苏省高考成绩查询入口
  10. linux 22 口令自动传马,近期用到的linux命令