2022-02-20:设计内存文件系统。 设计一个内存文件系统,模拟以下功能: ls: 以字符串的格式输入一个路径。如果它是一个文件的路径,那么函数返回一个列表,仅包含这个文件的名字。如果它是一个文件
Posted 福大大架构师每日一题
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2022-02-20:设计内存文件系统。 设计一个内存文件系统,模拟以下功能: ls: 以字符串的格式输入一个路径。如果它是一个文件的路径,那么函数返回一个列表,仅包含这个文件的名字。如果它是一个文件相关的知识,希望对你有一定的参考价值。
2022-02-20:设计内存文件系统。
设计一个内存文件系统,模拟以下功能:
ls: 以字符串的格式输入一个路径。如果它是一个文件的路径,那么函数返回一个列表,仅包含这个文件的名字。如果它是一个文件夹的的路径,那么返回该 文件夹内 的所有文件和子文件夹的名字。你的返回结果(包括文件和子文件夹)应该按字典序排列。
mkdir:输入一个当前不存在的 文件夹路径 ,你需要根据路径名创建一个新的文件夹。如果有上层文件夹路径不存在,那么你也应该将它们全部创建。这个函数的返回类型为 void 。
addContentToFile: 输入字符串形式的 文件路径 和 文件内容 。如果文件不存在,你需要创建包含给定文件内容的文件。如果文件已经存在,那么你需要将给定的文件内容 追加 在原本内容的后面。这个函数的返回类型为 void 。
readContentFromFile: 输入 文件路径 ,以字符串形式返回该文件的 内容 。
力扣588。
答案2022-02-20:
路径字符串按/分割成多个字符串,组装成树形结构。然后根据自然智慧就能求解。
代码用golang编写。代码如下:
package main
import (
"fmt"
"strings"
)
func main()
fs := NewFileSystem()
ret := make([]string, 0)
ret = fs.ls("/")
fmt.Println("ls = ", ret)
fs.mkdir("/a/b/c")
fs.addContentToFile("/a/b/c/d", "hello")
ret = fs.ls("/")
fmt.Println("ls = ", ret)
c := fs.readContentFromFile("/a/b/c/d")
fmt.Println("content = ", c)
type Node struct
// 文件名、目录名
name string
// content == null 意味着这个节点是目录
// content != null 意味着这个节点是文件
//public StringBuilder content;
content string
//public TreeMap<String, Node> nexts;
nexts map[string]*Node
// 构造目录
func NewNode(n string) *Node
ret := &Node
ret.name = n
//ret.content = null;
ret.nexts = make(map[string]*Node)
return ret
// 构造文件,c是文件内容
func NewNode2(n, c string) *Node
ret := &Node
ret.name = n
//content = new StringBuilder(c);
ret.content = c
//nexts = new TreeMap<>();
ret.nexts = make(map[string]*Node)
return ret
type FileSystem struct
head *Node
func NewFileSystem() *FileSystem
ret := &FileSystem
ret.head = NewNode("")
return ret
func (this *FileSystem) ls(path0 string) []string
//List<String> ans = new ArrayList<>();
ans := make([]string, 0)
cur := this.head
parts := strings.Split(path0, "/")
n := len(parts)
if path0 == "/"
n = 1
for i := 1; i < n; i++
if _, ok := cur.nexts[parts[i]]; !ok
return ans
cur = cur.nexts[parts[i]]
// cur结束了!来到path最后的节点,该返回了
// ls a/b/c cur 来到c目录
// 如果c是目录,那么就要返回c下面所有的东西!
// 如果c是文件,那么就值返回c
if cur.content == ""
//ans.addAll(cur.nexts.keySet());///
for k, _ := range cur.nexts
ans = append(ans, k)
//fmt.Println("aaa")
else
//ans.add(cur.name);///
ans = append(ans, cur.name)
//fmt.Println("bbb")
return ans
func (this *FileSystem) mkdir(path0 string)
cur := this.head
parts := strings.Split(path0, "/")
n := len(parts)
for i := 1; i < n; i++
if _, ok := cur.nexts[parts[i]]; !ok
cur.nexts[parts[i]] = NewNode(parts[i])
cur = cur.nexts[parts[i]]
func (this *FileSystem) addContentToFile(path0, content string)
cur := this.head
parts := strings.Split(path0, "/")
n := len(parts)
for i := 1; i < n; i++
if _, ok := cur.nexts[parts[i]]; !ok
cur.nexts[parts[i]] = NewNode(parts[i])
cur = cur.nexts[parts[i]]
// 来到的是倒数第二的节点了!注意for!
if _, ok := cur.nexts[parts[n-1]]; !ok
cur.nexts[parts[n-1]] = NewNode2(parts[n-1], "")
cur.content += content
func (this *FileSystem) readContentFromFile(path0 string) string
cur := this.head
parts := strings.Split(path0, "/")
n := len(parts)
for i := 1; i < n; i++
if _, ok := cur.nexts[parts[i]]; !ok
cur.nexts[parts[i]] = NewNode(parts[i])
cur = cur.nexts[parts[i]]
return cur.content
执行结果如下:
以上是关于2022-02-20:设计内存文件系统。 设计一个内存文件系统,模拟以下功能: ls: 以字符串的格式输入一个路径。如果它是一个文件的路径,那么函数返回一个列表,仅包含这个文件的名字。如果它是一个文件的主要内容,如果未能解决你的问题,请参考以下文章
[LeetCode] Design In-Memory File System 设计内存文件系统