leetcode 71. 简化路径-java双端队列实现
题目所属分类
正常模拟 或者用双端队列
deque.pollLast()
用于删除队列中的最后一个元素
String.join("/",deque)
是用/连接双端队列中的元素
原题链接
给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 ‘/’ 开头),请你将其转化为更加简洁的规范路径。
在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (…) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。任意多个连续的斜杠(即,‘//’)都被视为单个斜杠 ‘/’ 。 对于此问题,任何其他格式的点(例如,‘…’)均被视为文件/目录名称。
请注意,返回的 规范路径 必须遵循下述格式:
始终以斜杠 ‘/’ 开头。
两个目录名之间必须只有一个斜杠 ‘/’ 。
最后一个目录名(如果存在)不能 以 ‘/’ 结尾。
此外,路径仅包含从根目录到目标文件或目录的路径上的目录(即,不含 ‘.’ 或 ‘…’)。
返回简化后得到的 规范路径 。
代码案例:输入:path = “/home/”
输出:“/home”
解释:注意,最后一个目录名后面没有斜杠。
题解
正常模拟
res表示当前的路径,name表示遇到两个’/'之间的字符
1、遇到"…“,回到上一个目录,即将res最后一个以”/“开始往后的字符全部删去
2、遇到”.“或者多余的”/“不做处理
3、其他表示可以延伸新的路径,将”/" + name字符串加入到res后面
class Solution {
public String simplifyPath(String path) {
StringBuffer res = new StringBuffer();//定义答案
String name = "";//定义两个/之间的字符
if(path.charAt(path.length() - 1) != '/') path += '/';
for(char c : path.toCharArray()){
if(c != '/') name += c ;
else{
if(name.equals("..")){
while(res.length() > 0 && res.charAt(res.length() -1 ) != '/') res.deleteCharAt(res.length()-1);
if(res.length() > 0) res.deleteCharAt(res.length()-1);//去掉/
}else if(!name.equals(".") && !name.equals("") ){//当前目录或者情况
res.append("/").append(name);
}
name = "";
}
}
if(res.length() == 0) res.append("/");
return res.toString() ;
}
}
简便算法
利用的是双端队列
class Solution {
public String simplifyPath(String path) {
List<String> list = Arrays.asList("",".","..");
Deque<String> deque = new ArrayDeque<>();
for (String s : path.split("/")) {
if (!list.contains(s)){
deque.add(s);
}else if (!deque.isEmpty() && s.equals("..")){
deque.pollLast();//双端队列的最后一个元素去掉
}
}
return "/" + String.join("/", deque);
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)