LeetCode刷题——简化路径#71#Medium
Posted 喷火龙与水箭龟
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode刷题——简化路径#71#Medium相关的知识,希望对你有一定的参考价值。
简化路径的思路探讨与源码
简化路径的题目如下图,该题属于栈和字符串类型的题目,主要考察对于栈本身的理解和字符串遍历技巧的使用。本文的题目作者想到2种方法,分别是双端队列方法和栈方法,其中双端队列方法使用Java进行编写,而栈方法使用Python进行编写,当然这可能不是最优的解法,还希望各位大佬给出更快的算法。
本人认为该题目可以使用双端队列方法,首先初始化一个双端队列,并且将输入的字符串根据“斜杠”分割转化为数组,然后开始遍历数组,并且判断当前元素是否为空或者点,如果是就不操作;否则就判断当前元素是否为"..",如果是就继续判断双端队列是否不为空,如果满足就删除双端队列最后一个元素。否则就把元素添加到双端队列的尾部。遍历结束后,开始遍历双端队列,遍历取出队列头部的元素后拼接“斜杠”得到结果字符串,并且最后返回结果。那么按照这个思路我们的Java代码如下:
#喷火龙与水箭龟
class Solution {
public String simplifyPath(String path) {
Deque<String> doubleList = new LinkedList<>();
String[] arr = path.split("/");
for(int jr = 0; jr < arr.length; jr++){
String word = arr[jr];
if(word.equals("") || word.equals(".")){
continue;
}else if (word.equals("..")){
if(! doubleList.isEmpty()){
doubleList.pollLast();
}
}else{
doubleList.offer(word);
}
}
StringBuilder resFinal = new StringBuilder("/");
while(! doubleList.isEmpty()){
resFinal.append(doubleList.poll());
if(! doubleList.isEmpty()){
resFinal.append("/");
}
}
if(resFinal.toString().equals("")){
return "/";
}else{
return resFinal.toString();
}
}
}
显然,我们看到双端队列的效果不错,同时还可以使用栈方法进行处理。首先初始化一个列表作为栈,把字符串按照“斜杠”进行分割得到数组。然后开始遍历数组,如果栈不是空并且当前元素等于"..“那就把栈顶元素抛出,否则判断元素是否属于”.."如果是则插入到栈内,最后将栈转化为以“斜杠”分割的字符串并返回结果。所以按照这个思路就可以解决,下面是Python代码部分:
#喷火龙与水箭龟
class Solution:
def simplifyPath(self, path):
stackList = []
arr = path.split('/')
for jr in arr:
if stackList and jr == '..':
stackList.pop()
elif jr not in " ..":
stackList.append(jr)
resFinal = '/' + '/'.join(stackList)
return resFinal
从结果来说Java版本的双端队列方法的效率不错,而Python版本的栈方法的速度也不错,但应该是有更多的方法可以进一步提速的,希望朋友们能够多多指教,非常感谢。
以上是关于LeetCode刷题——简化路径#71#Medium的主要内容,如果未能解决你的问题,请参考以下文章