力扣 题目71- 简化路径

题解

这里我使用栈来做

分为两部分

1.分割

   我们需要将path的路径进行分割 /home//foo/ -> home foo

   注意:1.以/分割 多/视为一个/

            2.最后/特殊处理 因为由于/可能不在最后 所以最后的字段分割需要特殊处理

 1 stack<string> stk;
 2         string remain;
 3         for (int i = 0; i < path.size(); i++) {
 4             //判断是否为/
 5             if (path[i] == '/') {
 6                 if (remain.length()>0) {
 7                     stk.push(remain);
 8                     remain = "";
 9                 }
10                 continue;
11             }
12             remain += path[i];
13             //判断最后一个是不是/  如果不是则添加remain(由于上面是按照/划分 所以这里要判断)
14             if ((i == path.size() - 1) && path[i] != '/') {
15                 stk.push(remain);
16             }
17         }

2.输出并判断

输出栈顶至空 

对输出的字段 分成4种情况

   1. 如果是..则ellipsis+1(ellipsis是为了抵消下一次正常字段)

   2. 如果. 什么也不做

   3.如果ellipsis>0 则省略当前栈顶 而且 ellipsis-1

   4.其他情况 simpath.insert(0, "/" + stk.top()); 在最后结果前面插入

 1 int ellipsis = 0;
 2         string simpath = "";
 3         while (!stk.empty()) {
 4             //如果为..
 5             if (stk.top() == "..")
 6             {
 7                 ellipsis += 1;
 8             }
 9             //如果为.
10             else if (stk.top() == ".")
11             {
12             }
13             //如果ellipsis>0 要省略当前目录
14             else if (ellipsis > 0) {
15                 ellipsis -= 1;
16             }
17             //其他情况则在开头正常添加
18             else
19             {
20                 simpath.insert(0, "/" + stk.top());
21             }
22             stk.pop();
23         }

最后如果结果为根目录 simpath无法被添加任何东西即为空 但要返回/(特殊判断)

1 //如果最后simpath == "" 说明当到根目录 直接返回/
2         if (simpath == "") {
3             return "/";
4         }
5         return simpath;

代码

 1 #include<iostream>
 2 #include<string>
 3 #include<stack>
 4 using namespace std;
 5 class Solution {
 6 public:
 7     string simplifyPath(string path) {
 8         //1.切割/到栈
 9         stack<string> stk;
10         string remain;
11         for (int i = 0; i < path.size(); i++) {
12             //判断是否为/
13             if (path[i] == '/') {
14                 if (remain.length()>0) {
15                     stk.push(remain);
16                     remain = "";
17                 }
18                 continue;
19             }
20             remain += path[i];
21             //判断最后一个是不是/  如果不是则添加remain(由于上面是按照/划分 所以这里要判断)
22             if ((i == path.size() - 1) && path[i] != '/') {
23                 stk.push(remain);
24             }
25         }
26         //2.输出/到记录省略
27         int ellipsis = 0;
28         string simpath = "";
29         while (!stk.empty()) {
30             //如果为..
31             if (stk.top() == "..")
32             {
33                 ellipsis += 1;
34             }
35             //如果为.
36             else if (stk.top() == ".")
37             {
38             }
39             //如果ellipsis>0 要省略当前目录
40             else if (ellipsis > 0) {
41                 ellipsis -= 1;
42             }
43             //其他情况则在开头正常添加
44             else
45             {
46                 simpath.insert(0, "/" + stk.top());
47             }
48             stk.pop();
49         }
50         //如果最后simpath == "" 说明当到根目录 直接返回/
51         if (simpath == "") {
52             return "/";
53         }
54         return simpath;
55     }
56 };
57 
58 int main() {
59     Solution sol;
60     string path = "/home//b/./././d";
61     string simpath=sol.simplifyPath(path);
62     cout << simpath << endl;
63 
64 }
View Code

 

posted @ 2022-06-23 17:35  无聊的阿库娅  阅读(22)  评论(0编辑  收藏  举报