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
}

执行结果如下:


左神java代码

2022-02-20:设计内存文件系统。 设计一个内存文件系统,模拟以下功能: ls: 以字符串的格式输入一个路径。如果它是一个文件的路径,那么函数返回一个列表,仅包含这个文件的名字。如果它是一个文件的更多相关文章

  1. 2022.02.20 SA

    2022.02.20 SA 如果我还能看见明天黎明,如果我还能再爬起来,我仍会走我的路,哪怕这条路已经荒废许久,也许我们无法拥有感情,我们甚至无法像个正常人一样接受太阳的洗礼,但是我依然会执行我的条约 ...

  2. controller函数中参数列表使用多个@RequestBody

    首先出现这种情况是因为有下面这种需求 $.ajax({ type: "POST", url: "${pageContext.request.contextPath}/co ...

  3. vscode笔记(一)- vscode自动生成文件头部注释和函数注释

    VsCode 自动生成文件头部注释和函数注释 作者:狐狸家的鱼 本文链接:vscode自动生成文件头部注释和函数注释 GitHub:sueRimn 1.安装插件KoroFileHeader 2.设置 ...

  4. C语言程序设计:综合设计实验一(设计一个文字游戏)

    目录 C语言程序设计:综合设计实验一(设计一个文字游戏) 1.实验要求 2.设计思路 3.源码 4.后话 C语言程序设计:综合设计实验一(设计一个文字游戏) 1.实验要求 (1) 设计一个文字游戏,通 ...

  5. Path,Files巩固,题目:从键盘接收两个文件夹路径,把其中一个文件夹中(包含内容)拷贝到另一个文件夹中

    这个题目用传统的File,InputStream可以做,但是如果用Files,Path类做,虽然思路上会困难一些,但是代码简洁了很多,以下是代码: import java.io.IOException ...

  6. 键盘录入一个文件夹路径,统计该文件夹(包含子文件夹)中每种类型的文件及个数,注意:用文件类型(后缀名,不包含.(点),如:"java","txt")作为key, 用个数作为value,放入到map集合中,遍历map集合

    package cn.it.zuoye5; import java.io.File;import java.util.HashMap;import java.util.Iterator;import ...

  7. stdafx.h、stdafx.cpp是干什么用的?为什么我的每一个cpp文件都必须包含stdafx.h? Windows和MFC的include文件都非常大,即使有一个快速的处理程序,编

    sstdafx.h.stdafx.cpp是干什么用的?为什么我的每一个cpp文件都必须包含stdafx.h? Windows和MFC的include文件都非常大,即使有一个快速的处理程序,编译程序也要 ...

  8. 通信方案软件设计(环形动态申请内存,支持USART+IIC+SPI+CAN协议

    1 <STM32进阶之串口环形缓冲区实现>中讲得比较清楚(链接) 2 amobbs中讲的方法有点复杂,以下是链接和参考源码: 通信方案软件设计(环形动态申请内存,支持USART+IIC+S ...

  9. 干货长文:Linux 文件系统与持久性内存介绍

    关注「开源Linux」,选择"设为星标" 回复「学习」,有我为您特别筛选的学习资料~ 1.Linux 虚拟文件系统介绍 在 Linux 系统中一切皆文件,除了通常所说的狭义的文件以 ...

  10. VC++打开对话框选择一个文件夹路径 BROWSEINFO结构

    typedef struct _browseinfoW { HWND hwndOwner; PCIDLIST_ABSOLUTE pidlRoot; LPWSTR pszDisplayName; // ...

随机推荐

  1. 1--我们写了一个java类,那么生成一个对象占用多大的内存?

    public class Student { private long id; private long userId; private byte state; private long create ...

  2. JWT用户认证体系

    依赖 <dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</artifa ...

  3. 【chatQA】nvm包版本管理

    如何使用nvm来管理不同版本的 Node.js,然后使用不同的 Node.js 版本来运行不同版本的 React 应用? 要使用 nvm 来管理不同版本的 Node.js,可以按照以下步骤进行操作: ...

  4. Centos7 禁用IPV6地址的方法

    方法 1 编辑文件/etc/sysctl.conf, vi /etc/sysctl.conf 添加下面的行: net.ipv6.conf.all.disable_ipv6 =1 net.ipv6.co ...

  5. 笔精墨妙,妙手丹青,微软开源可视化版本的ChatGPT:Visual ChatGPT,人工智能AI聊天发图片,Python3.10实现

    说时迟那时快,微软第一时间发布开源库Visual ChatGPT,把 ChatGPT 的人工智能AI能力和Stable Diffusion以及ControlNet进行了整合.常常被互联网人挂在嘴边的& ...

  6. Javaweb学习笔记第十五弹--Listente概述、AJAX、Axiox、JSON

    Listener(监听器) 可以在application.session和request三个对象创建 Javaweb提供了8个监听器,其中较为典型的是ServletContextListener监听器 ...

  7. 使用 Agora SDK 开发 React Native 视频通话App

    在 React Native 的应用中,从头开始添加视频通话功能是很复杂的.要保证低延迟.负载平衡,还要注意管理用户事件状态,非常繁琐.除此之外,还必须保证跨平台的兼容性. 当然有个简单的方法可以做到 ...

  8. 声网把七年无全网事故的实时传输网络SD-RTN全面开放了——这就是FPA!

    8 月 19 日,声网Agora 举办线上产品发布会,正式发布了"全链路加速 FPA(Full-Path Accelerator)".全链路加速 FPA 基于声网的软件定义实时网络 ...

  9. kafka的原理及集群部署详解

    kafka原理详解 消息队列概述 消息队列分类 点对点 组成:消息队列(Queue).发送者(Sender).接收者(Receiver) 特点:一个生产者生产的消息只能被一个接受者接收,消息一旦被消费 ...

  10. DFS总结

    常见剪枝方法 优化搜索顺序 优先搜索决策树较小的点,例如在165. 小猫爬山一题中,优先搜索体重较大的扩展出的情况较少 排除冗余信息 如果某些情况在此前已经被搜索过了,那么无需继续搜索 可行性剪枝 如 ...