From baa9d15520727f418cfdd6cdf2b6efcff1989e23 Mon Sep 17 00:00:00 2001 From: YDZ Date: Thu, 13 Jun 2019 08:46:07 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20problem=2071?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0071. Simplify Path/71. Simplify Path.go | 35 +++++++++ .../71. Simplify Path_test.go | 77 +++++++++++++++++++ Algorithms/0071. Simplify Path/README.md | 64 +++++++++++++++ 3 files changed, 176 insertions(+) create mode 100644 Algorithms/0071. Simplify Path/71. Simplify Path.go create mode 100644 Algorithms/0071. Simplify Path/71. Simplify Path_test.go create mode 100644 Algorithms/0071. Simplify Path/README.md diff --git a/Algorithms/0071. Simplify Path/71. Simplify Path.go b/Algorithms/0071. Simplify Path/71. Simplify Path.go new file mode 100644 index 00000000..5726957f --- /dev/null +++ b/Algorithms/0071. Simplify Path/71. Simplify Path.go @@ -0,0 +1,35 @@ +package leetcode + +import ( + "path/filepath" + "strings" +) + +// 解法一 +func simplifyPath(path string) string { + arr := strings.Split(path, "/") + stack := make([]string, 0) + var res string + for i := 0; i < len(arr); i++ { + cur := arr[i] + //cur := strings.TrimSpace(arr[i]) 更加严谨的做法应该还要去掉末尾的空格 + if cur == ".." { + if len(stack) > 0 { + stack = stack[:len(stack)-1] + } + } else if cur != "." && len(cur) > 0 { + stack = append(stack, arr[i]) + } + } + if len(stack) == 0 { + return "/" + } else { + res = strings.Join(stack, "/") + } + return "/" + res +} + +// 解法二 golang 的官方库 API +func simplifyPath_(path string) string { + return filepath.Clean(path) +} diff --git a/Algorithms/0071. Simplify Path/71. Simplify Path_test.go b/Algorithms/0071. Simplify Path/71. Simplify Path_test.go new file mode 100644 index 00000000..65dd575a --- /dev/null +++ b/Algorithms/0071. Simplify Path/71. Simplify Path_test.go @@ -0,0 +1,77 @@ +package leetcode + +import ( + "fmt" + "testing" +) + +type question71 struct { + para71 + ans71 +} + +// para 是参数 +// one 代表第一个参数 +type para71 struct { + s string +} + +// ans 是答案 +// one 代表第一个答案 +type ans71 struct { + one string +} + +func Test_Problem71(t *testing.T) { + + qs := []question71{ + + question71{ + para71{"/.hidden"}, + ans71{"/.hidden"}, + }, + + question71{ + para71{"/..hidden"}, + ans71{"/..hidden"}, + }, + + question71{ + para71{"/abc/..."}, + ans71{"/abc/..."}, + }, + + question71{ + para71{"/home/"}, + ans71{"/home"}, + }, + + question71{ + para71{"/..."}, + ans71{"/..."}, + }, + + question71{ + para71{"/../"}, + ans71{"/"}, + }, + + question71{ + para71{"/home//foo/"}, + ans71{"/home/foo"}, + }, + + question71{ + para71{"/a/./b/../../c/"}, + ans71{"/c"}, + }, + } + + fmt.Printf("------------------------Leetcode Problem 71------------------------\n") + + for _, q := range qs { + _, p := q.ans71, q.para71 + fmt.Printf("【input】:%v 【output】:%v\n", p, simplifyPath(p.s)) + } + fmt.Printf("\n\n\n") +} diff --git a/Algorithms/0071. Simplify Path/README.md b/Algorithms/0071. Simplify Path/README.md new file mode 100644 index 00000000..085988d3 --- /dev/null +++ b/Algorithms/0071. Simplify Path/README.md @@ -0,0 +1,64 @@ +# [71. Simplify Path](https://leetcode.com/problems/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: + +```c +Input: "/home/" +Output: "/home" +Explanation: Note that there is no trailing slash after the last directory name. +``` + +Example 2: + +```c +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: + +```c +Input: "/home//foo/" +Output: "/home/foo" +Explanation: In the canonical path, multiple consecutive slashes are replaced by a single one. +``` + +Example 4: + +```c +Input: "/a/./b/../../c/" +Output: "/c" +``` + + +Example 5: + +```c +Input: "/a/../../b/../c//.//" +Output: "/c" +``` + +Example 6: + +```c +Input: "/a//b////c/d//././/.." +Output: "/a/b/c" +``` + +## 题目大意 + +给出一个 Unix 的文件路径,要求简化这个路径。这道题也是考察栈的题目。 + +## 解题思路 + +这道题笔者提交了好多次才通过,并不是题目难,而是边界条件很多,没考虑全一种情况就会出错。有哪些边界情况就看笔者的 test 文件吧。 \ No newline at end of file