zoukankan      html  css  js  c++  java
  • LeetCode-071-简化路径

    简化路径

    题目描述:给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 '/' 开头),请你将其转化为更加简洁的规范路径。

    在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (..) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。任意多个连续的斜杠(即,'//')都被视为单个斜杠 '/' 。 对于此问题,任何其他格式的点(例如,'...')均被视为文件/目录名称。

    请注意,返回的 规范路径 必须遵循下述格式:

    始终以斜杠 '/' 开头。
    两个目录名之间必须只有一个斜杠 '/' 。
    最后一个目录名(如果存在)不能 以 '/' 结尾。
    此外,路径仅包含从根目录到目标文件或目录的路径上的目录(即,不含 '.' 或 '..')。
    返回简化后得到的 规范路径 。

    示例说明请见LeetCode官网。

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/simplify-path/
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    解法一:利用栈

    声明一个栈paths用来存出现过的目录,然后遍历path的字符,获取每一个/之间的字符串str,str有以下几种可能:

    • 如果str是 .,则不用处理;
    • 如果str是..,而且paths不为空,则paths抛弃栈顶元素即最外层目录;
    • 如果str不是以上两种情况,则说明str是一个目录,入栈。

    最后,将paths倒序排列,然后拼成目录格式返回。

    import java.util.Stack;
    
    public class LeetCode_071 {
        public static String simplifyPath(String path) {
            Stack<String> paths = new Stack<>();
            String str = "";
            for (char c : path.toCharArray()) {
                if (c == '/') {
                    if (str.length() != 0) {
                        if (str.equals(".")) {
                        } else if (str.equals("..")) {
                            if (!paths.isEmpty()) {
                                paths.pop();
                            }
                        } else {
                            paths.push(str);
                        }
                        str = "";
                    }
                } else {
                    str += c;
                }
            }
            if(str.length() != 0) {
                if (str.equals(".")) {
                } else if (str.equals("..")) {
                    if (!paths.isEmpty()) {
                        paths.pop();
                    }
                } else {
                    paths.push(str);
                }
            }
            if (paths.isEmpty()) {
                return "/";
            }
            Stack<String> reversePaths = new Stack<>();
            while (!paths.isEmpty()) {
                reversePaths.push(paths.pop());
            }
            String result = "";
            while (!reversePaths.isEmpty()) {
                result += "/" + reversePaths.pop();
            }
            return result;
        }
    
        public static void main(String[] args) {
            System.out.println(simplifyPath("/a//b////c/d//././/.."));
        }
    }
    

    【每日寄语】 成功的道路是由目标铺成的,大目标比没目标有用,小目标比大目标有用,现在不玩命,将来命玩你。

  • 相关阅读:
    Hibernate+JPA (EntityMange讲解)
    JPA和Hibernate的区别
    Hibernate与Jpa的关系,终于弄懂
    JEE学习线路
    J2EE中你必须了解的13种技术规范
    js设置datagriad的行移动
    js正则表达式中的特殊字符
    iOS 开发之动画篇
    Phone APP设计规范/iPad APP设计规范/Android APP设计规范/网页设计规范
    打包程序时的证书问题(上传APP就出现Missing iOS Distribution signing indetity for)
  • 原文地址:https://www.cnblogs.com/kaesar/p/15159689.html
Copyright © 2011-2022 走看看