首页 > 其他分享 >简化路径为符合unix风格的字符串

简化路径为符合unix风格的字符串

时间:2024-05-30 22:34:03浏览次数:23  
标签:String .. unix 简化 result 斜杠 字符串 path 目录

题目

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

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

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

示例 1:
输入:path = "/home/"
输出:"/home"
解释:注意,最后一个目录名后面没有斜杠。
示例 2:
输入:path = "/../"
输出:"/"
解释:从根目录向上一级是不可行的,因为根目录是你可以到达的最高级。
示例 3:
输入:path = "/home//foo/"
输出:"/home/foo"
解释:在规范路径中,多个连续斜杠需要用一个斜杠替换。
示例 4:
输入:path = "/a/./b/../../c/"
输出:"/c"

提示:

1 <= path.length <= 3000
path 由英文字母,数字,'.','/' 或 '_' 组成。
path 是一个有效的 Unix 风格绝对路径。

题目分析

在一个unix风格的路径中,只有三个可能出现的元素:
1.'/';
2.'.';
3.'文件/文件夹名称'
在这个前提下,我们可以注意到,需要重点关注的只有是否需要转入上一级目录以及文件/文件夹的名称。
也就是说 / 和 单独的一个'.'我们是完全不需要进行处理的,因为这两个元素我们既不需要转到上一级目录,也不需要进入下一级目录。
有一个函数能够帮助我们忽略一部分元素,String中的split方法。这个方法可以针对我们指定的某个字符来将字符串分割为字符数组。

String names = path.split('/');

通过这句话,names中只有'.'和'文件/文件夹名称'了。那么我们针对 '..'需要转入上一级目录,这让我们想到可以使用栈的特性将最上面的一层目录弹出以达到跳到上一级目录的目的。
现在我们知道我们需要将目录顺序记录在一个载体里,以便我们最后的输出。同时这个载体需要能满足栈的特性。那么什么样的数据结构能够同时满足尾部弹出和头部弹出?
很容易想到双端队列。这种队列既能够从尾部操作元素,也能从头部操作。
Deque,在JAVA中一个Queue的子类。
如果想要了解更多关于java中queue的信息,可以跳入这个链接
在这里我们只需要用到

pollLast    弹出队尾的元素
offerLast   从队尾插入元素并返回bool值
pollFirst   弹出队首元素

完整代码

    public String simplifyPath(String path) {
        String[] names = path.split("/"); //将path按照/分割为字符串数组
        Deque<String> stack = new ArrayDeque<String>();  //创建元素为String 的双端队列
        for(String name: names){
            if("..".equals(name)){   //..代表需要跳转到上一级目录,对应着出栈
                if(!stack.isEmpty()){
                    stack.pollLast(); 
                }
            }else if(name.length()>0 && !".".equals(name)){
                stack.offerLast(name);      //从队尾插入元素,等同于入栈,判断条件为不为空且不是单个的'.'
            }
        }

        String result = new String();       //这里可以是String也可以是StringBuffer;差别在后面插入新的字符或者字符串的方式不一样;
        if(stack.isEmpty()){
            result = result+'/';  
        }else{
            while(!stack.isEmpty()){
                result = result+'/';
                result = result + stack.pollFirst();
            }
        }

        return result;
    }

标签:String,..,unix,简化,result,斜杠,字符串,path,目录
From: https://www.cnblogs.com/Radioactive/p/18223309

相关文章

  • [FAQ] unix, unixpacket 属于传输层吗
     unix和unixpacket(也称作Unix域套接字)并不属于TCP/IP模型中的传输层。它们是操作系统提供的另一种通信机制,主要用于在同一台机器上的进程间通信(IPC,Inter-ProcessCommunication)。Unix域套接字可以看作是文件系统中的一个特殊文件,具有以下两种类型:流式Unix域套接字(uni......
  • 如何了解转义字符和字符串的细节运用?
    1.什么是转义字符呢?转义字符是一组特殊的字符转义字符顾名思义:转变原来的意思的字符例如:‘n’原本就是简单字符n 如果加上/那么/n转变换行的意思2.那么转义字符有那些呢?\?:在书写连续多个问号时使用,防止他们被解析成三字母词,在新编译器上无法验证三字母词??( --[?......
  • 代码随想录算法训练营Day55 | 583. 两个字符串的删除操作、72. 编辑距离、编辑距离总
    本文目录583.两个字符串的删除操作做题看文章72.编辑距离做题看文章编辑距离总结篇以往忽略的知识点小结个人体会583.两个字符串的删除操作代码随想录:583.两个字符串的删除操作Leetcode:583.两个字符串的删除操作做题找出最长公共子序列,然后用两个字符串的......
  • Linux有关环境搭建使用python简化操作
    我用这种方式安装过z.lua,好用;记录一些常用的api:api记录获取用户主目录home_dir=os.path.expanduser("~")获取脚本文件的绝对路径zlua_path=os.path.abspath(__file__)zlua_dir=os.path.dirname(zlua_path)构建路径字符串#构建目标文件路径target_dir=......
  • Jackson序列化为字符串时对指定字段脱敏
    枚举脱敏字段类型及规则importjava.util.function.Function;publicenumTextMaskStrategy{ID_NO("身份证",18,text->"*".repeat(text.length()-4)+text.substring(text.length()-4)),PHONE("手机号",11,text->text.substr......
  • 未验证:字符串解析为字典的九种方法/
    我是说直接把字典里的内容变成字符串然后解析这个字符串为字典然后才是代码中的计算,我是让你修改代码将输出字符串解析为字典的九种方法:方法一:使用正则表达式importreparsed_item_prices={}current_item=Noneforlineinoutput_string.split('\n'):if......
  • python-旋转字符串
    问题描述:给定一个字符串(以字符串数组的形式)和一个偏移量,根据偏移量从左到右地旋转字符数组。问题示例:输入str=”abcdefg”,offset=3,输出“efgabcd”。输入str=”abcdefg”,offset=0,输出“abcdefg”。(返回旋转后的字符串) 完整代码如下:a=list(input().split())n=int(inpu......
  • C#去掉字符串首尾字符
    以下是多种不同的实现方法来去除C#字符串的首尾字符:1、使用Substring方法:stringinput="HelloWorld!";stringoutput=input.Substring(1,input.Length-2);2、使用Remove方法:stringinput="HelloWorld!";stringoutput=input.Remove(0,1).Remove(input.Leng......
  • LeetCode 第8题:字符串转换整数 (atoi)
    本文我们来看看LeetCode第8题.字符串转换整数(atoi)的解析过程。文章目录一、引言题目描述示例二、解题思路1.丢弃无用的前导空格2.处理正负号3.读入数字4.处理整数溢出5.组合起来思路流程图三、Java代码实现代码解析1.移除前导空格2.处理正负号3.转换数......
  • 28. 找出字符串中第一个匹配项的下标
    28.找出字符串中第一个匹配项的下标ShowSwiftCodefunccomputePMT(_pattern:String)->[Int]{letm=pattern.lengthvarpmt=[Int](repeating:0,count:m)varj=0foriin1..<m{whilej>0&&pattern[p......