万网注册域名就可以做网站吗,凯里做网站的公司,厦门外贸网站建设报价,网站跨机房建设方案优质博文#xff1a;IT-BLOG-CN
一、题目
给你一个字符串path#xff0c;表示指向某一文件或目录的Unix风格 绝对路径 #xff08;以/开头#xff09;#xff0c;请你将其转化为更加简洁的规范路径。在Unix风格的文件系统中#xff0c;一个点.表示当前目录本身#x…优质博文IT-BLOG-CN
一、题目
给你一个字符串path表示指向某一文件或目录的Unix风格 绝对路径 以/开头请你将其转化为更加简洁的规范路径。在Unix风格的文件系统中一个点.表示当前目录本身此外两个点..表示将目录切换到上一级指向父目录两者都可以是复杂相对路径的组成部分。任意多个连续的斜杠即//都被视为单个斜杠/ 。 对于此问题任何其他格式的点例如...均被视为文件/目录名称。
请注意返回的 规范路径 必须遵循下述格式 【1】始终以斜杠/开头。 【2】两个目录名之间必须只有一个斜杠/。 【3】最后一个目录名如果存在不能 以/结尾。 【4】此外路径仅包含从根目录到目标文件或目录的路径上的目录即不含.或..。
返回简化后得到的 规范路径。
示例 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风格绝对路径。 二、代码
栈 首先将给定的字符串path根据/分割成一个由若干字符串组成的列表记为paths。根据题目中规定的「规范路径的下述格式」paths中包含的字符串只能为以下几种 【1】空字符串。例如当出现多个连续的/就会分割出空字符串 【2】一个点. 【3】两个点.. 【4】只包含英文字母、数字或_的目录名。
对于「空字符串」以及「一个点」我们实际上无需对它们进行处理因为「空字符串」没有任何含义而「一个点」表示当前目录本身我们无需切换目录。
对于「两个点」或者「目录名」我们则可以用一个栈来维护路径中的每一个目录名。当我们遇到「两个点」时需要将目录切换到上一级因此只要栈不为空我们就弹出栈顶的目录。当我们遇到「目录名」时就把它放入栈。
这样一来我们只需要遍历paths中的每个字符串并进行上述操作即可。在所有的操作完成后我们将从栈底到栈顶的字符串用/进行连接再在最前面加上/表示根目录就可以得到简化后的规范路径。
class Solution {public String simplifyPath(String path) {if (path null || path.length() 0) {return /;}// 思想因为有 .. 返回上一层所以需要通过栈的思想进行处理DequeString stack new LinkedList();String[] paths path.split(/);// 遍历路径对空字符串和.不进行处理其它的压入栈对..进行弹出for(String p : paths) {if (...equals(p)) {if (!stack.isEmpty() ){stack.pollLast();}} else if (p.length() 0 !..equals(p)) {stack.offerLast(p);}}StringBuffer sb new StringBuffer();if (stack.isEmpty()) {return /;}while (!stack.isEmpty()) {sb.append(/).append(stack.pollFirst());}return sb.toString();}
}时间复杂度 O(n)其中n是字符串path的长度。 空间复杂度 O(n)。我们需要O(n)的空间存储names中的所有字符串。
一句话解释: 栈解决,把当前目录压入栈中,遇到…弹出栈顶,最后返回栈中元素.
class Solution:def simplifyPath(self, path: str) - str:stack []path path.split(/)for item in path:if item ..:if stack : stack.pop()elif item and item ! .:stack.append(item)return / /.join(stack)正序遍历对多种情况先进行判断再进行字符串拼接
先用“/”分割字符串再判断每个子串的情况 是单词就添加进list是 … 就除去list的末尾元素其他情况忽略最终用“/”拼接成答案res返回即可
class Solution {public String simplifyPath(String path) {ListString list new ArrayList();String[] split path.split(/);for (int i 0; i split.length; i) {if (split[i].equals(.) || split[i].isEmpty()){continue;} else if (split[i].equals(..)) {if (!list.isEmpty())list.remove(list.size()-1);}else {list.add(split[i]);}}StringBuilder res new StringBuilder();for (int i 0; i list.size(); i) {res.append(/).append(list.get(i));}return !res.toString().isEmpty() ? res.toString() : /;}
}时间复杂度 O(n)其中n是字符串path的长度。 空间复杂度 O(n)。我们需要O(n)的空间存储names中的所有字符串。
模拟根据题意使用栈进行模拟即可。
具体的从前往后处理path每次以item为单位进行处理有效的文件名根据item为何值进行分情况讨论
item为有效值 存入栈中 item为 … 弹出栈顶元素若存在 item为 . 不作处理。
class Solution {public String simplifyPath(String path) {DequeString d new ArrayDeque();int n path.length();for (int i 1; i n; ) {if (path.charAt(i) / i 0) continue;int j i 1;while (j n path.charAt(j) ! /) j;String item path.substring(i, j);if (item.equals(..)) {if (!d.isEmpty()) d.pollLast();} else if (!item.equals(.)) {d.addLast(item);}i j;}StringBuilder sb new StringBuilder();while (!d.isEmpty()) sb.append(/ d.pollFirst());return sb.length() 0 ? / : sb.toString();}
}时间复杂度 O(n)其中n是字符串path的长度。 空间复杂度 O(n)。我们需要O(n)的空间存储names中的所有字符串。