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.设计文件系统相关推荐

  1. LeetCode 1166. 设计文件系统(哈希map)

    文章目录 1. 题目 2. 解题 1. 题目 你需要设计一个能提供下面两个函数的文件系统: create(path, value): 创建一个新的路径,并尽可能将值 value 与路径 path 关联 ...

  2. 最新腾讯面试题汇总--C++后端开发岗(部分含答案)

    阻塞.非阻塞.同步.异步 的区别 阻塞 阻塞调用是指调用结果返回之前,当前线程会被挂起(线程进入非可执行状态,在这个状态下,cpu 不会给线程分配时间片,即线程暂停运行).函数只有在得到结果之后才会返 ...

  3. 日志结构文件系统的设计与实现

    from The Design and Implementation of a Log-Structured File System--–Mendel Rosenblum and John K. Ou ...

  4. coursera 《现代操作系统》 -- 第十周 文件系统(2)

    身份验证 Authentication 知道用户是谁.通过账号密码.Id 这样的识别出来. 访问控制 Permission 知道用户是谁后. 主动控制 记录用户ID和对应的访问权限 --> 记录 ...

  5. 力扣刷题心得(设计类题目)

    设计类题目基本考察的是你对现实事物的抽象能力,一般会遇到一些类的设计.字符串切分.集合的使用(list.map.set.stack.deque)等,结束后我会更新一些关于这些集合的常见使用方法和场景. ...

  6. 简单文件系统的实现_300来行代码带你实现一个能跑的最小Linux文件系统

    Linux作为一个类UNIX系统,其文件系统保留了原始UNIX文件系统的表象形式,它看起来是这个样子: t@name-VirtualBox:/# lsbin boot cdrom dev etc ho ...

  7. 面向云数据库,超低延迟文件系统PolarFS诞生了

    阿里妹导读:随着国内首款Cloud Native自研数据库POLARDB精彩亮相ICDE 2018的同时,作为其核心支撑和使能平台的PolarFS文件系统的相关论文"PolarFS: An ...

  8. 模拟实现EXT2文件系统

    设计EXT2文件系统 实验目的 (1)掌握文件系统的工作原理 (2)理解文件系统的主要数据结构 (3)学习较为复杂的 Linux 下的编程 (4)了解 EXT2 文件系统的结构 实验内容 设计并实现一 ...

  9. 【转】如何实现一个文件系统

    如何实现一个文件系统 摘要 本章目的是分析在Linux系统中如何实现新的文件系统.在介绍文件系统具体实现前先介绍文件系统的概念和作用,抽象出文件系统概念模型.熟悉文件系统的内涵后,我们再进一步讨论Li ...

最新文章

  1. 求逆元 - HNU 13412 Cookie Counter
  2. 难离难舍的internet2与SDN
  3. android gradle自定义钉钉群提醒
  4. 基于 Android NDK 的学习之旅-----JNI 数据类型
  5. nancy框架安装并使用
  6. 怎么查看eclipse的版本号
  7. 《探索需求》——阅读笔记一
  8. electronic-wechat高分屏下的缩放修改
  9. c# uwp html源码,C#UWP使用Microsoft Edge打开Web URL
  10. Miniflter中 NPInstanceSetup调查
  11. 人工智能-baidu-aip语音识别(语音转文字)
  12. linux解析器错误权限不够,实例解析Linux下目录的权限
  13. 2021年中国石油沥青供需及发展趋势分析[图]
  14. PPT创作技巧及有用素材
  15. lookAhead和RAdam 真香
  16. 2019年前端大事件回顾:流年笑掷,未来可期
  17. JAVA 实现《坦克大战》游戏|CSDN创作打卡
  18. mysql 1197_mysql主从不同步报错Last_Errno 1197
  19. SSM知识梳理(整理一半)
  20. Halcon算子说明

热门文章

  1. 学生信息管理系统之测试篇
  2. Flutter3引用原生播放器-IOS(Swift)篇
  3. heritrix3 java_Windows配置heritrix3做网络爬虫开发实例
  4. 数据分析包的比较:R,Matlab,SciPy,Excel,SAS,SPSS,Stata
  5. kindle无法开机
  6. 《安富莱嵌入式周报》第312期:开源磁场照相机,仿生神经元PCB,开源无线耳机,手机系统PalmOS移植到各种单片机,开放系统组装协议OSAP
  7. 计算机主机报警 声,电脑出现报警声怎么办?电脑出现报警声的原因
  8. grasshopper elk插件_Grasshopper常用插件汇总
  9. 华为eNSP配置标准ACL
  10. Unity 编辑器代码打开场景