GVKun编程网logo

LeetCode开心刷题四十八天——71. Simplify Path(leetcode刷题视频)

28

关于LeetCode开心刷题四十八天——71.SimplifyPath和leetcode刷题视频的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于19.2.13[LeetCode71]Sim

关于LeetCode开心刷题四十八天——71. Simplify Pathleetcode刷题视频的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于19.2.13 [LeetCode 71] Simplify Path、71. Simplify Path、Leet Code 71 Simplify Path - 简化路径 - Java、LeetCode - Medium - 71. Simplify Path等相关知识的信息别忘了在本站进行查找喔。

本文目录一览:

LeetCode开心刷题四十八天——71. Simplify Path(leetcode刷题视频)

LeetCode开心刷题四十八天——71. Simplify Path(leetcode刷题视频)

71. Simplify Path
Medium

Given an absolute path for a file (Unix-style),simplify it. Or in other words,convert it to the canonical path.

In a UNIX-style file system,a period . refers to the current directory. Furthermore,a double period .. moves the directory up a level. For more information,see: Absolute path vs relative path in Linux/Unix

Note that the returned canonical path must always begin with a slash /,and there must be only a single slash / between two directory names. The last directory name (if it exists) must not end with a trailing /. Also,the canonical path must be the shortest string representing the absolute path.

 

Example 1:

Input: "/home/"
Output: "/home" Explanation: Note that there is no trailing slash after the last directory name. 

Example 2:

Input: "/../"
Output: "/" Explanation: Going one level up from the root directory is a no-op,as the root level is the highest level you can go. 

Example 3:

Input: "/home//foo/"
Output: "/home/foo" Explanation: In the canonical path,multiple consecutive slashes are replaced by a single one. 

Example 4:

Input: "/a/./b/../../c/"
Output: "/c" 

Example 5:

Input: "/a/../../b/../c//.//"
Output: "/c" 

Example 6:

Input: "/a//b////c/d//././/.."
Output: "/a/b/c"

搞清规则是很重要的,简而言之,遇到.代表当前层,忽略。..上一层,把已经入栈清除,剩下的文字都是正常的路径,但是开始要有/,中间的/只能有一个
Python问题是,没有封装的类,对这个要自己实现,另外用Python函数实现对/的分割
class Solution(object):
    def simplifyPath(self,path):
        """
        :type path: str
        :rtype: str
        """
        # define stack
        stack=list()
        # split string
        path=[p for p in path.split(/) if p]
        for p in path:
            if p == .:
                continue
            elif p == ..:
                if stack:
                    stack.pop()
            else:
                stack.append(p)
        return /+/.join(stack)

Solu=Solution()
path="/a/./b/../../c/"
print(Solu.simplifyPath(path))
 
 

BONUS:

1.有可能会出现多个/的情况,直接用split划分,会导致出现空字符串,解决方法是,加上判断语句。在循环过程直接加到stack里

2.

Python join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串。

语法

join()方法语法:

str.join(sequence)

19.2.13 [LeetCode 71] Simplify Path

19.2.13 [LeetCode 71] Simplify Path

Given an absolute path for a file (Unix-style),simplify it. Or in other words,convert it to the canonical path.

In a UNIX-style file system,a period . refers to the current directory. Furthermore,a double period .. moves the directory up a level. For more information,see: Absolute path vs relative path in Linux/Unix

Note that the returned canonical path must always begin with a slash /,and there must be only a single slash / between two directory names. The last directory name (if it exists) must not end with a trailing /. Also,the canonical path must be the shortest string representing the absolute path.

 

Example 1:

Input: "/home/" Output: "/home" Explanation: Note that there is no trailing slash after the last directory name. 

Example 2:

Input: "/../" Output: "/" Explanation: Going one level up from the root directory is a no-op,as the root level is the highest level you can go. 

Example 3:

Input: "/home//foo/" Output: "/home/foo" Explanation: In the canonical path,multiple consecutive slashes are replaced by a single one. 

Example 4:

Input: "/a/./b/../../c/" Output: "/c" 

Example 5:

Input: "/a/../../b/../c//.//" Output: "/c" 

Example 6:

Input: "/a//b////c/d//././/.." Output: "/a/b/c"

题意

简化绝对路径,最后一个目录后不能有/

空路径写作"/",如果要求访问根目录的上一级目录则自动简化为根目录自己,如例2

题解

分享图片

分享图片

 1 class Solution {
 2 public:
 3     string simplifyPath(string path) {
 4         string ans = "";
 5         int p = 0,l = path.length();
 6         while (p < l) {
 7             if (path[p] != /) {
 8                 string menu = "";
 9                 while (p < l&&path[p] != /)
10                     menu += path[p++];
11                 if (menu == ".")
12                     continue;
13                 else if (menu == "..") {
14                     int idx = ans.rfind(/);
15                     if (idx == string::npos)continue;
16                     ans.erase(idx);
17                 }
18                 else
19                     ans += "/" + menu;
20             }
21             p++;
22         }
23         if (ans.empty())return "/";
24         return ans;
25     }
26 };
View Code

71. Simplify Path

71. Simplify Path

Given an absolute path for a file (Unix-style), simplify it. Or in other words, convert it to the canonical path.
In a UNIX-style file system, a period . refers to the current directory. Furthermore, a double period .. moves the directory up a level. For more information, see: Absolute path vs relative path in Linux/Unix

Note that the returned canonical path must always begin with a slash /, and there must be only a single slash / between two directory names. The last directory name (if it exists) must not end with a trailing /. Also, the canonical path must be the shortest string representing the absolute path.

Example 1:

Input: "/home/"
Output: "/home"
Explanation: Note that there is no trailing slash after the last directory name.

Example 2:

Input: "/../"
Output: "/"
Explanation: Going one level up from the root directory is a no-op, as the root level is the highest level you can go.

Example 3:

Input: "/home//foo/"
Output: "/home/foo"
Explanation: In the canonical path, multiple consecutive slashes are replaced by a single one.

Example 4:

Input: "/a/./b/../../c/"
Output: "/c"

Example 5:

Input: "/a/../../b/../c//.//"
Output: "/c"

Example 6:

Input: "/a//b////c/d//././/.."
Output: "/a/b/c"

难度:medium

题目:给出unix风格的绝对路径,简化它。换名话说转成canonical 路径。 在unix风格系统里。.指当前目录。..指上一级目录。

思路:stack

Runtime: 14 ms, faster than 74.20% of Java online submissions for Simplify Path.
Memory Usage: 37.2 MB, less than 1.00% of Java online submissions for Simplify Path.

class Solution {
    public String simplifyPath(String path) {
        String[] strs = path.split("/");
        Stack<String> stack = new Stack<String>();
        
        for (int i = 0; i < strs.length; i++) {
            if (strs[i].isEmpty() || strs[i].equals(".")) {
                continue;
            }
            
            if (strs[i].equals("..")) {
                if (!stack.isEmpty()) stack.pop();
            } else {
                stack.push("/" + strs[i]);
            }
        }
        
        StringBuilder sb = new StringBuilder();
        for (String s: new ArrayList<String>(stack)) {
            sb.append(s);
        }
        
        return stack.isEmpty() ? "/" : sb.toString();
    }
}

Leet Code 71 Simplify Path - 简化路径 - Java

Leet Code 71 Simplify Path - 简化路径 - Java

问题原始链接 https://leetcode.com/problems/simplify-path

给定一个文件的绝对路径(Unix风格),简化它。

例如:

path = "/home/", => "/home"
path = "/a/./b/../../c/", => "/c"

思路:路径先按"/"拆分,申请一个双端队列,依次处理每个部分,如果为"."则不做任何处理,如果为"..",则弹出队尾元素,如果为其他情况则压入队尾。最后队列中元素拼接成简化后的路径。

public class Solution {
  public static String simplifyPath(String path) {
    if (path == null || path.length() == 0) {
      return "/";
    }

    String[] strs = path.split("/");
    LinkedList<String> list = new LinkedList<String>();
    for (String str : strs) {
      if (str.length() == 0 || ".".equals(str)) {
        continue;
      }
      if ("..".equals(str)) {
        list.pollLast();
        continue;
      }
      list.addLast(str);
    }
    String result = "";
    while (list.size() > 0) {
      result += "/" + list.pollFirst();
    }
    return result.length() > 0 ? result : "/";
  }
}

 

LeetCode - Medium - 71. Simplify Path

LeetCode - Medium - 71. Simplify Path

Topic

  • String
  • Stack

Description

https://leetcode.com/problems/simplify-path/

Given a string path, which is an absolute path (starting with a slash ''/'') to a file or directory in a Unix-style file system, convert it to the simplified canonical path.

In a Unix-style file system, a period ''.'' refers to the current directory, a double period ''..'' refers to the directory up a level, and any multiple consecutive slashes (i.e. ''//'') are treated as a single slash ''/''. For this problem, any other format of periods such as ''...'' are treated as file/directory names.

The canonical path should have the following format:

  • The path starts with a single slash ''/''.
  • Any two directories are separated by a single slash ''/''.
  • The path does not end with a trailing ''/''.
  • The path only contains the directories on the path from the root directory to the target file or directory (i.e., no period ''.'' or double period ''..'')

Return the simplified canonical path.

Example 1:

Input: path = "/home/"
Output: "/home"
Explanation: Note that there is no trailing slash after the last directory name.

Example 2:

Input: path = "/../"
Output: "/"
Explanation: Going one level up from the root directory is a no-op, as the root level is the highest level you can go.

Example 3:

Input: path = "/home//foo/"
Output: "/home/foo"
Explanation: In the canonical path, multiple consecutive slashes are replaced by a single one.

Example 4:

Input: path = "/a/./b/../../c/"
Output: "/c"

Constraints:

  • 1 <= path.length <= 3000
  • path consists of English letters, digits, period ''.'', slash ''/'' or ''_''.
  • path is a valid absolute Unix path.

Analysis

Submission

import java.util.LinkedList;

public class SimplifyPath {

	// 方法一:我写的
	public String simplifyPath(String path) {
		LinkedList<String> dirs = new LinkedList<>();
		for (int p1 = 0, p2 = 1; p2 <= path.length(); p2++) {

			if (p2 == path.length() || path.charAt(p2) == ''/'') {
				String dir = path.substring(p1 + 1, p2);
				p1 = p2;

				if (dir.equals("") || dir.equals("."))
					continue;

				if (dir.equals("..")) {
					if (!dirs.isEmpty())
						dirs.removeLast();
				} else {
					dirs.add(dir);
				}
			}
		}

		StringBuilder sb = new StringBuilder();
		dirs.stream().forEach(dir -> sb.append("/").append(dir));
		return sb.length() == 0 ? "/" : sb.toString();
	}

	// 方法二:别人写的,写得更简洁
	public String simplifyPath2(String path) {
		LinkedList<String> list = new LinkedList<>();
		for (String cur : path.split("/")) {
			if (cur.equals("..")) {
				if (!list.isEmpty())
					list.removeLast();
			} else if (cur.length() > 0 && !cur.equals("."))
				list.add(cur);
		}
		return "/" + String.join("/", list);
	}

}

Test

import static org.junit.Assert.*;
import org.junit.Test;

public class SimplifyPathTest {

	@Test
	public void test() {
		SimplifyPath obj = new SimplifyPath();

		assertEquals("/home", obj.simplifyPath("/home/"));
		assertEquals("/", obj.simplifyPath("/../"));
		assertEquals("/home/foo", obj.simplifyPath("/home//foo/"));
		assertEquals("/c", obj.simplifyPath("/a/./b/../../c/"));

		assertEquals("/home", obj.simplifyPath2("/home/"));
		assertEquals("/", obj.simplifyPath2("/../"));
		assertEquals("/home/foo", obj.simplifyPath2("/home//foo/"));
		assertEquals("/c", obj.simplifyPath2("/a/./b/../../c/"));

	}
}

关于LeetCode开心刷题四十八天——71. Simplify Pathleetcode刷题视频的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于19.2.13 [LeetCode 71] Simplify Path、71. Simplify Path、Leet Code 71 Simplify Path - 简化路径 - Java、LeetCode - Medium - 71. Simplify Path等相关内容,可以在本站寻找。

本文标签:

上一篇Shell - difference between '[email protected]" and "$*"

下一篇71. Simplify Path