71-简化路径(Simplify Path)

题目描述
中文

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

	在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (..) 表示将目录切换到上一级(指向父目录);两者
	都可以是复杂相对路径的组成部分。更多信息请参阅:Linux / Unix中的绝对路径 vs 相对路径
	
	请注意,返回的规范路径必须始终以斜杠 / 开头,并且两个目录名之间必须只有一个斜杠 /。最后一个目录名(如果存在)不能以 / 结
	尾。此外,规范路径必须是表示绝对路径的最短字符串。

英文

	Given an absolute path for a file (Unix-style), simplify it. Or in other words, convert it to the 
	canonical path.

	In a UNIX-style file system, a period . refers to the current directory. Furthermore, a double 
	period .. moves the directory up a level. For more information, see: Absolute path vs relative path 
	in Linux/Unix
	
	Note that the returned canonical path must always begin with a slash /, and there must be only a 
	single slash / between two directory names. The last directory name (if it exists) must not end with 
	a trailing /. Also, the canonical path must be the shortest string representing the absolute path.

示例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.好吧,我现在也没什么思路...可不可以尝试用暴力的方法做呢?暴力+if判断是否可行呢?我们来试一下。
class Solution {
    public String simplifyPath(String path) {
        String[] temp = path.split("\\/");          //用将字符串切割
        List<String> list = new ArrayList<String>();    //存放绝对路径目录
        for(String s:temp){
            if(s.length() != 0){
                if(s.equals("..")){          //如果是返回上层 且可以返回
                    if(list.size() > 0){
                        list.remove(list.size()-1);
                    }
                    else{
                        continue;
                    }
                }
                else if(s.equals(".")){
                    continue;
                }    
                else{
                    list.add(s);
                }
            }
        }
        String res = new String();
        for(String s:list){
            res = res + "/" + s;
        }
        if(res.length() == 0)           //如果最后路径为空,返回根目录
            res = "/";
        return res;
    }
}
  • 很明显,是可以的,解决过程就是先将字符串以"/"切割开,然后进行逻辑判断,最后拼接路径就可以解决了。现在让我们用python3再写一次。
class Solution:
    def simplifyPath(self, path: str) -> str:
        strings = path.split("/")
        paths = []
        for string in strings:
            if len(string) != 0:
                if string == "..":
                    if len(paths) > 0:
                        del paths[len(paths) - 1]
                    else:
                        continue
                elif string == '.':
                    continue
                else:
                    paths.append(string)
        res = ""
        for path in paths:
            res = res + "/" + path
        if len(res) == 0:
            res = "/"
        return res
  • 但是有没有更为聪明的方法呢?emmm,我暂时想不到,咱们来看下别人的代码
  • 额。好吧,好像大家思路都一样,只不过是用栈来做的,打扰了,今天就到这里。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,可以看出simplifyPath函数是一个C++函数,用于简化给定的路径。该函数使用了塌边法进行三角面片简化,使得复杂模型可以Mesh得到简化。下面是一个简单的C++示例代码: ```c++ #include <iostream> #include <vector> #include <sstream> using namespace std; class Solution { public: string simplifyPath(string path) { string ans, group; vector<string> strs; stringstream ss(path); while (getline(ss, group, '/')) { if (group == "" || group == ".") continue; if (group == ".." && strs.size()) strs.pop_back(); else if (group != "..") strs.push_back(group); } for (string& str : strs) ans += "/" + str; return ans.size() ? ans : "/"; } }; int main() { Solution s; string path = "/a/./b/../../c/"; cout << s.simplifyPath(path) << endl; // 输出:/c return 0; } ``` 上述代码中,我们首先定义了一个Solution类,其中包含了一个simplifyPath函数。该函数接受一个字符串类型的参数path,表示需要简化路径。在函数内部,我们首先定义了三个变量:ans、group和strs。其中,ans用于存储简化后的路径,group用于存储每个路径段,strs用于存储所有非"."和".."的路径段。 接下来,我们使用stringstream将path按照"/"进行分割,并将每个路径段存储到group中。如果group为空或者为".",则直接跳过;如果group为"..",则将strs中最后一个路径段弹出;否则,将group存储到strs中。 最后,我们遍历strs中的所有路径段,并将它们拼接成一个新的路径ans。如果ans不为空,则返回ans;否则,返回根路径"/"。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值