• 每天一道Rust-LeetCode(2019-06-10)


    每天一道Rust-LeetCode(2019-06-02) Z 字形变换

    坚持每天一道题,刷题学习Rust.

    题目描述

    https://leetcode-cn.com/problems/simplify-path/

    以 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//b////c/d//././/.."
    输出:"/a/b/c"

    解题过程

    思路:

    1. 根据/将string 分割
    2. 用栈来处理
    3. 如果是空忽略,如果是..则出栈
    4. 最后把栈里的字符串拼接即可.
    struct Solution {}
    impl Solution {
        pub fn simplify_path(path: String) -> String {
            let mut st = Vec::new();
            let ss: Vec<_> = path.split("/").collect();
            for s in path.split("/") {
                //            println!("s={}", s);
                if s.len() == 0 {
                    continue;
                } else if s == ".." {
                    st.pop();
                } else if s == "." {
                    continue;
                } else {
                    st.push(s);
                }
            }
            let mut s = String::new();
            for t in st {
                s += "/";
                s += t;
            }
            if s.len() == 0 {
                s += "/"
            }
            s
        }
    }
    
    mod test {
        use super::*;
        #[test]
        fn test_path() {
            assert_eq!(
                "/home/foo",
                Solution::simplify_path(String::from("/home//foo/"))
            );
            assert_eq!("/home", Solution::simplify_path(String::from("/home")));
            assert_eq!("/", Solution::simplify_path(String::from("/../")));
            assert_eq!(
                "/c",
                Solution::simplify_path(String::from("/a/./b/../../c/"))
            );
            assert_eq!(
                "/a/b/c",
                Solution::simplify_path(String::from("/a//b////c/d//././/.."))
            );
        }
    }
    
    

    一点感悟

    太简单了,有凑数之嫌,下次应该找一些有价值的来做

    其他

    欢迎关注我的github,本项目文章所有代码都可以找到.

  • 相关阅读:
    PHP的错误和异常处理
    异步并行批处理框架设计的一些思考
    系统出错信息设计
    SpringMVC+Shiro权限管理
    jstl教程
    为什么Lisp语言如此先进
    「只差程序员」为什么会招黑? [转自:知乎]
    大侠是怎样炼成的 周昆 [转]
    【OpenGL】glFinish()和glFlush()函数详解-[转]
    VC++ 6.0中实现三叉切分窗口与多视图 [转]
  • 原文地址:https://www.cnblogs.com/baizx/p/10995788.html
Copyright © 2020-2023  润新知