LeetCode1166.设计文件系统
leecode题链接:LeetCode1166.设计文件系统
题目描述:
你需要设计一个能提供下面两个函数的文件系统:
create(path, value): 创建一个新的路径,并尽可能将值 value 与路径 path 关联,然后返回 True。如果路径已经存在或者路径的父路径不存在,则返回 False。
get(path): 返回与路径关联的值。如果路径不存在,则返回 -1。
“路径” 是由一个或多个符合下述格式的字符串连接起来形成的:在 / 后跟着一个或多个小写英文字母。
例如 /leetcode 和 /leetcode/problems 都是有效的路径,但空字符串和 / 不是有效的路径。
示例 1:
输入:
[“FileSystem”,“create”,“get”]
[[],["/a",1],["/a"]]
输出:
[null,true,1]
解释:
FileSystem fileSystem = new FileSystem();
fileSystem.create("/a", 1); // 返回 true
fileSystem.get("/a"); // 返回 1
示例 2:
输入:
[“FileSystem”,“create”,“create”,“get”,“create”,“get”]
[[],["/leet",1],["/leet/code",2],["/leet/code"],["/c/d",1],["/c"]]
输出:
[null,true,true,2,false,-1]
解释:
FileSystem fileSystem = new FileSystem();
fileSystem.create("/leet", 1); // 返回 true
fileSystem.create("/leet/code", 2); // 返回 true
fileSystem.get("/leet/code"); // 返回 2
fileSystem.create("/c/d", 1); // 返回 false 因为父路径 “/c” 不存在。
fileSystem.get("/c"); // 返回 -1 因为该路径不存在。
提示:
对两个函数的调用次数加起来小于等于 10^4
2 <= path.length <= 100
1 <= value <= 10^9
解题思路:
使用哈希表处理,题解如注释所示。
以下用C语言实现:
#define MAX_PATH_LEN 101typedef struct {char keyPath[MAX_PATH_LEN];int value;UT_hash_handle hh;
} FileSystem;FileSystem* fileSystemCreate() {FileSystem *obj = NULL;FileSystem* sys = (FileSystem*)malloc(sizeof(FileSystem));memset(sys, 0, 1 * sizeof(FileSystem));HASH_ADD_STR(obj, keyPath, sys);return obj;
}/* ADD */
bool fileSystemCreatePath(FileSystem* obj, char * path, int value) {char* startPos = strchr(path, '/'); /* */char* endPos = strrchr(path, '/');FileSystem *out = NULL;HASH_FIND_STR(obj, path, out);if (out != NULL) { /* 路径存在,返错 */return false;}if (startPos != endPos) { /* 说明path是子路径 */char fatherPath[MAX_PATH_LEN] = {0};strncpy(fatherPath, path, endPos - startPos); /* 取出父路径 */HASH_FIND_STR(obj, fatherPath, out);if (out == NULL) { /* 父路径不存在,返错 */return false;}}/* path为父路径且不存在;path子路径且其父路径存在,则创建 */FileSystem *newSys = (FileSystem *)malloc(1 * sizeof(FileSystem));strcpy(newSys->keyPath, path);newSys->value = value;HASH_ADD_STR(obj, keyPath, newSys);return true;
}int fileSystemGet(FileSystem* obj, char * path) {FileSystem *out = NULL;HASH_FIND_STR(obj, path, out);if (out == NULL) { /* 不存在,则返错 */return -1;}return out->value;
}void fileSystemFree(FileSystem* obj) {FileSystem *cur = NULL;FileSystem *tmp = NULL;HASH_ITER(hh, obj, cur, tmp) {HASH_DEL(obj, cur);free(cur);}return;
}
解题总结:
需要会使用哈希的几个基本宏和步骤
0、定义
typedef struct {char keyPath[MAX_PATH_LEN]; /* key */int value; /* value */UT_hash_handle hh; /* 哈希表句柄 */
} FileSystem;
1、初始化
定义一个头指针 FileSystem *head = NULL;
但本例直接在 fileSystemCreate() 函数中定义,并分配一个临时的空表,加入哈希表中。
2、表示增加,相关的宏有:
字符串:#define HASH_ADD_STR(head,strfield,add)
整型: #define HASH_ADD_INT(head,intfield,add)
指针: #define HASH_ADD_PTR(head,ptrfield,add)
本例中,哈希的key是字符串型的路径keyPath,故用 HASH_ADD_STR,且strfield即为keyPath,add应为 FileSystem add,add是一对(keyPath, value)键值。
HASH_ADD_STR(obj, keyPath, sys); / obj为头指针,keyPath为key域,sys为add键值对 */
注意,add需要malloc。
3、表示查找,相关的宏为:
字符串:#define HASH_FIND_STR(head,findstr,out)
整型: #define HASH_FIND_INT(head,findint,out)
指针: #define HASH_FIND_PTR(head,findptr,out)
本例中,函数入参path是要寻址匹配的路径,findstr即为path,out参数是匹配的结果,如果为空说明没有匹配上;非空说明匹配上了。
HASH_FIND_STR(obj, keyPath, out); /* obj为头指针,keyPath为key域,out为寻找结果键值对 */
4、表示删除,相关宏为:
#define HASH_DEL(head,delptr)
用法上结合遍历的宏:
#define HASH_ITER(hh,head,el,tmp)
如本例中,
FileSystem *cur = NULL;FileSystem *tmp = NULL;HASH_ITER(hh, obj, cur, tmp) {HASH_DEL(obj, cur);free(cur);}
5、表示替换,相关的宏有(本例没有用到):
字符串:#define HASH_REPLACE_STR(head,strfield,add,replaced)
整型: #define HASH_REPLACE_INT(head,intfield,add,replaced)
指针: #define HASH_REPLACE_PTR(head,ptrfield,add,replaced)
LeetCode1166.设计文件系统相关推荐
- LeetCode 1166. 设计文件系统(哈希map)
文章目录 1. 题目 2. 解题 1. 题目 你需要设计一个能提供下面两个函数的文件系统: create(path, value): 创建一个新的路径,并尽可能将值 value 与路径 path 关联 ...
- 最新腾讯面试题汇总--C++后端开发岗(部分含答案)
阻塞.非阻塞.同步.异步 的区别 阻塞 阻塞调用是指调用结果返回之前,当前线程会被挂起(线程进入非可执行状态,在这个状态下,cpu 不会给线程分配时间片,即线程暂停运行).函数只有在得到结果之后才会返 ...
- 日志结构文件系统的设计与实现
from The Design and Implementation of a Log-Structured File System--–Mendel Rosenblum and John K. Ou ...
- coursera 《现代操作系统》 -- 第十周 文件系统(2)
身份验证 Authentication 知道用户是谁.通过账号密码.Id 这样的识别出来. 访问控制 Permission 知道用户是谁后. 主动控制 记录用户ID和对应的访问权限 --> 记录 ...
- 力扣刷题心得(设计类题目)
设计类题目基本考察的是你对现实事物的抽象能力,一般会遇到一些类的设计.字符串切分.集合的使用(list.map.set.stack.deque)等,结束后我会更新一些关于这些集合的常见使用方法和场景. ...
- 简单文件系统的实现_300来行代码带你实现一个能跑的最小Linux文件系统
Linux作为一个类UNIX系统,其文件系统保留了原始UNIX文件系统的表象形式,它看起来是这个样子: t@name-VirtualBox:/# lsbin boot cdrom dev etc ho ...
- 面向云数据库,超低延迟文件系统PolarFS诞生了
阿里妹导读:随着国内首款Cloud Native自研数据库POLARDB精彩亮相ICDE 2018的同时,作为其核心支撑和使能平台的PolarFS文件系统的相关论文"PolarFS: An ...
- 模拟实现EXT2文件系统
设计EXT2文件系统 实验目的 (1)掌握文件系统的工作原理 (2)理解文件系统的主要数据结构 (3)学习较为复杂的 Linux 下的编程 (4)了解 EXT2 文件系统的结构 实验内容 设计并实现一 ...
- 【转】如何实现一个文件系统
如何实现一个文件系统 摘要 本章目的是分析在Linux系统中如何实现新的文件系统.在介绍文件系统具体实现前先介绍文件系统的概念和作用,抽象出文件系统概念模型.熟悉文件系统的内涵后,我们再进一步讨论Li ...
最新文章
- 求逆元 - HNU 13412 Cookie Counter
- 难离难舍的internet2与SDN
- android gradle自定义钉钉群提醒
- 基于 Android NDK 的学习之旅-----JNI 数据类型
- nancy框架安装并使用
- 怎么查看eclipse的版本号
- 《探索需求》——阅读笔记一
- electronic-wechat高分屏下的缩放修改
- c# uwp html源码,C#UWP使用Microsoft Edge打开Web URL
- Miniflter中 NPInstanceSetup调查
- 人工智能-baidu-aip语音识别(语音转文字)
- linux解析器错误权限不够,实例解析Linux下目录的权限
- 2021年中国石油沥青供需及发展趋势分析[图]
- PPT创作技巧及有用素材
- lookAhead和RAdam 真香
- 2019年前端大事件回顾:流年笑掷,未来可期
- JAVA 实现《坦克大战》游戏|CSDN创作打卡
- mysql 1197_mysql主从不同步报错Last_Errno 1197
- SSM知识梳理(整理一半)
- Halcon算子说明
热门文章
- 学生信息管理系统之测试篇
- Flutter3引用原生播放器-IOS(Swift)篇
- heritrix3 java_Windows配置heritrix3做网络爬虫开发实例
- 数据分析包的比较:R,Matlab,SciPy,Excel,SAS,SPSS,Stata
- kindle无法开机
- 《安富莱嵌入式周报》第312期:开源磁场照相机,仿生神经元PCB,开源无线耳机,手机系统PalmOS移植到各种单片机,开放系统组装协议OSAP
- 计算机主机报警 声,电脑出现报警声怎么办?电脑出现报警声的原因
- grasshopper elk插件_Grasshopper常用插件汇总
- 华为eNSP配置标准ACL
- Unity 编辑器代码打开场景