首页 > 试题广场 >

简化目录路径

[编程题]简化目录路径
  • 热度指数:774 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个目录路径的字符串path,path由英文字母,数字,".","/" 或 "_"组成,表示指向某一个文件或者目录的绝对路径,但是有的路径会有复杂的表达,比如"/../"其实还是代表的根目录路径"/"请你将这个绝对路径转化为一个更加简洁的规范路径,转化规则如下:
1.将1个点"."表示当前目录本身,即"/a/b/./"=>表示的还是"/a/b"
2.将2个点".."表示将目前切换到上一级,即"/a/b/../"其实表示的是"/a"
3.其他数目的点或者点加上其他字符视为一个普通目录路径,比如"/.../a.."表示的是根目下有一个名字为"..."的目录文件,"..."的文件下面还有一个名字为"a.."的文件
4.任意多个连续的斜杠都被视为单个斜杠,即 "///"和"//"都被视为"/"

你返回的简化规范路径应该如下:
5.始终以斜杠 '/' 开头
6.两个目录名之间必须只有一个斜杠 '/'
7.最后一个目录名不能 '/' 结尾,根目录除外,根目录只有一个"/"
8.路径仅包含从根目录到目标文件或目录的路径上的目录,即除了"."和".."的东西应该简化,其余的普通字符应该保留下来,视为目录路径


数据范围:
示例1

输入

"/home/web/"

输出

"/home/web"
示例2

输入

"/home////web//"

输出

"/home/web"

说明

在简化规范路径中,多个连续的"/"替换为"/", 
示例3

输入

"/../"

输出

"/"

说明

"/"是根目录,是顶级目录,它的上级目录还是自己 
示例4

输入

"/home/web/./tang/../miao/"

输出

"/home/web/miao"

说明

"/home/web/./"表示的是"/home/web",因为"."表示当前目录,但是"/home/web/./tang/../"表示的还是"/home/web",因为".."表示父目录,"/home/web/tang"的父目录就是"/home/web" 
struct Solution{

}

impl Solution {
    fn new() -> Self {
        Solution{}
    }

    /**
    * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
    *
    * 
        * @param path string字符串 
        * @return string字符串
    */
    pub fn simplifyPath(&self, path: String) -> String {
        // write code here
        let mut s = Vec::new();
        path.split("/").into_iter().for_each(|x| {
            // println!("{}", x);
            match x {
                ".." => {s.pop();},
                "." => (),
                x if x.len() != 0 => {s.push(x);},
                _ => (),
            }
        });
        if s.len() == 0 {
            "/".to_string()
        } else {
            s.into_iter().fold("".to_string(), |x, y| x + "/" + &y)
        }
    }
}

发表于 2023-08-21 09:51:17 回复(0)
importjava.util.*;
 
 
publicclassSolution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param path string字符串
     * @return string字符串
     */
    publicString simplifyPath (String path) {
        // write code here
        String[] strs = path.split("/");
        Stack<String> stack =newStack<>();
        for(String str: strs) {
            if(str.equals("..")) {
                if(!stack.isEmpty()) {
                    stack.pop();
                }
            }
            elseif(!(str.equals(".") || str.equals(""))) {
                stack.push(str);
            }
        }
        String res ="";
        while(!stack.isEmpty()) {
            res ="/"+ stack.pop() + res;
        }
        returnres.length() ==0?"/": res;
    }
}
发表于 2022-07-12 16:20:56 回复(0)

问题信息

上传者:牛客301499号
难度:
2条回答 1374浏览

热门推荐

通过挑战的用户

查看代码