zoukankan      html  css  js  c++  java
  • 每天一道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,本项目文章所有代码都可以找到.

  • 相关阅读:
    JAVA FTP 客户端 .
    附件上传byte2hex二行制转字符串优化方法
    JSTL的c:forEach标签(${status.index})
    jco 连接池
    FOWARD和response.sendRedirect()区别
    Windows BAT命令编写大全
    SQLServer 触发器详解
    区分ff/ie6/ie7/ie8,解决样式不兼容
    android在学习——程序的退出
    关于struts2 获取页面表单信息的个人做法
  • 原文地址:https://www.cnblogs.com/baizx/p/10995788.html
Copyright © 2011-2022 走看看