LeetCode刷题实战588设计内存文件系统
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !
今天和大家聊的问题叫做 设计内存文件系统,我们先来看题面:
https://leetcode-cn.com/problems/design-in-memory-file-system/
Design an in-memory file system to simulate the following functions:
ls: Given a path in string format. If it is a file path, return a list that only contains this file"s name. If it is a directory path, return the list of file and directory names in this directory. Your output (file and directory names together) should in lexicographic order.
mkdir: Given a directory path that does not exist, you should make a new directory according to the path. If the middle directories in the path don"t exist either, you should create them as well. This function has void return type.
addContentToFile: Given a file path and file content in string format. If the file doesn"t exist, you need to create that file containing given content. If the file already exists, you need to append given content to original content. This function has void return type.
readContentFromFile: Given a file path, return its content in string format.
设计一个内存文件系统,模拟以下功能:
ls:以字符串的格式输入一个路径。如果它是一个文件的路径,那么函数返回一个列表,仅包含这个文件的名字。如果它是一个文件夹的的路径,那么返回该 文件夹内 的所有文件和子文件夹的名字。你的返回结果(包括文件和子文件夹)应该按字典序排列。
mkdir:输入一个当前不存在的 文件夹路径 ,你需要根据路径名创建一个新的文件夹。如果有上层文件夹路径不存在,那么你也应该将它们全部创建。这个函数的返回类型为 void 。
addContentToFile:输入字符串形式的 文件路径 和 文件内容 。如果文件不存在,你需要创建包含给定文件内容的文件。如果文件已经存在,那么你需要将给定的文件内容 追加 在原本内容的后面。这个函数的返回类型为 void 。
readContentFromFile:输入 文件路径 ,以字符串形式返回该文件的 内容 。示例输入:
["FileSystem","ls","mkdir","addContentToFile","ls","readContentFromFile"]
[[],["/"],["/a/b/c"],["/a/b/c/d","hello"],["/"],["/a/b/c/d"]]
输出:
[,[],,,["a"],"hello"]解题
https://www.cnblogs.com/grandyang/p/6944331.html
这道题让我们设计一个内存文件系统,实现显示当前文件,创建文件,添加内容到文件,读取文件内容等功能,感觉像是模拟一个terminal的一些命令。这道题比较tricky的地方是ls这个命令,题目中的例子其实不能很好的展示出ls的要求,其对文件和文件夹的处理方式是不同的。由于这里面的文件没有后缀,所以最后一个字符串有可能是文件,也有可能是文件夹。比如a/b/c,那么最后的c有可能是文件夹,也有可能好是文件,如果c是文件夹的话,ls命令要输出文件夹c中的所有文件和文件夹,而当c是文件的话,只需要输出文件c即可。另外需要注意的是在创建文件夹的时候,路径上没有的文件夹都要创建出来,还有就是在给文件添加内容时,路径中没有的文件夹都要创建出来。论坛上这道题的高票解法都新建了一个自定义类,但是博主一般不喜欢用自定义类来解题,而且感觉那些使用了自定义类的解法并没有更简洁易懂,所以这里博主就不创建自定义类了,而是使用两个哈希表来做,其中dirs建立了路径和其对应的包含所有文件和文件夹的集合之间的映射,files建立了文件的路径跟其内容之间的映射。
最开始时将根目录"/"放入dirs中,然后看ls的实现方法,如果该路径存在于files中,说明最后一个字符串是文件,那么我们将文件名取出来返回即可,如果不存在,说明最后一个字符串是文件夹,那么我们到dirs中取出该文件夹内所有的东西返回即可。再来看mkdir函数,我们的处理方法就是根据"/"来分隔分隔字符串,如果是Java,那么直接用String自带的split函数就好了,但是C++没有Java那么多自带函数,所以只能借助字符串流类来处理,处理方法就是将每一层的路径分离出来,然后将该层的文件或者文件夹加入对应的集合中,注意的地方就是处理根目录时,要先加上"/",其他情况都是后加。下面来看addContentToFile函数,首先分离出路径和文件名,如果路径为空,说明是根目录,需要加上"/",然后看这个路径是否已经在dirs中存在,如果不存在,调用mkdir来创建该路径,然后把文件加入该路径对应的集合中,再把内容加入该文件路径的映射中。最后的读取文件内容就相当简单了,直接在files中返回即可,参见代码如下:class FileSystem {
public:
FileSystem {
dirs["/"];
}
vector ls(string path) {
if (files.count(path)) {
int idx = path.find_last_of("/");
return {path.substr(idx + 1)};
}
auto t = dirs[path];
return vector(t.begin, t.end);
}
void mkdir(string path) {
istringstream is(path);
string t = "", dir = "";
while (getline(is, t, "/")) {
if (t.empty) continue;
if (dir.empty) dir += "/";
dirs[dir].insert(t);
if (dir.size > 1) dir += "/";
dir += t;
}
}
void addContentToFile(string filePath, string content) {
int idx = filePath.find_last_of("/");
string dir = filePath.substr(0, idx);
string file = filePath.substr(idx + 1);
if (dir.empty) dir = "/";
if (!dirs.count(dir)) mkdir(dir);
dirs[dir].insert(file);
files[filePath].append(content);
}
string readContentFromFile(string filePath) {
return files[filePath];
}
private:
unordered_map dirs;
unordered_map files;
};
在看或者转发吧,你们的支持是我最大的动力 。
上期推文:
LeetCode1-580题汇总,希望对你有点帮助!
LeetCode刷题实战581:最短无序连续子数组
LeetCode刷题实战582:杀掉进程
LeetCode刷题实战583:两个字符串的删除操作
LeetCode刷题实战584:寻找用户推荐人
LeetCode刷题实战585:2016年的投资
LeetCode刷题实战586:订单最多的客户
LeetCode刷题实战587:安装栅栏
5G消息来了,就问微信怕不怕?近日,中国三大运营商联合发布了5G消息白皮书。一石激起千层浪,网上关于这个服务是否具有颠覆性,是否能有效反击微信的讨论热火朝天。可能很多人心里也在犯嘀咕,不就是区区一个消息服务么,
5G手机到底牛逼在哪里?(SRS轮发)随着5G时代的到来,5G手机如雨后春笋般涌现。顾名思义,5G手机最大的卖点自然就是5G,其中一个术语SRS轮发经常看到厂家在宣传。据说支持SRS轮发之后,手机的上网速度会更快!这分
敢做最潮玩家,引领时代潮流须眉剃须刀R2潮玩版体验前言提到剃须刀,我想对于每个男人都有几款吧?同时它也是除了手机以外最常用的生活产品了吧?而我也一直在寻找属于自己并且适合自己的剃须刀,之前买过很多产品,例如飞利浦米家须眉等等。随着
在大数据面前,每个人都是赤裸的我的女儿还是高中生,你们却给她邮寄婴儿服和婴儿床的优惠券,这是在鼓励她怀孕吗?一个男子冲进一家商店,要求经理出来见他,并怒不可遏地说出了上述这句话。几天后,经理打电话向这个男人致歉
5G的速度,可能比4G还要慢?2020年,作为5G元年,5G网络建设突飞猛进,5G手机也大量涌现。可是,就算是买了最新的5G手机,并且开机后手机右上角显示着大大的5G信号标识,可别着急为此欣喜若狂。实际用起来,
5G室内覆盖为何要电信,联通和广电共建共享?2月10日,工信部发布消息称,已同意中国电信中国联通中国广电共同使用33003400MHz频段频率用于5G室内覆盖。再加上今年一月初广电获取的4。9GHz实验频谱,以及在去年确定的
百度网盘,是怎样偷走你的流量的?近期,百度又一次站在了风口浪尖。这次的原因是,百度网盘搞了个用户激励计划,通过分享用户的闲置带宽以及电脑的存储空间,用来加快网盘的传输速度。当然,百度的这个计划对分享带宽和硬盘用户
5G的速度到底能有多快?2020年已到。这一年正是国际电联5G愿景中的商用元年。实际上,从2019年开始,5G的幼苗早已在欧美中日韩破土而出。今年,这批幼苗正在茁壮成长,并已在全球分蘖蔓延成燎原之势。对于
有了5G,这三种应用让生活更精彩!5G正在敞开怀抱,向我们飞奔而来。2020年伊始,5G的技术研究,前期的部署探索已经完成,宏图正在徐徐展开。中国的三大运营商经过来去年的练兵,今年要完成所有地级市的连续覆盖。随着各
你的手机下载能有多快?原来手机的能力也分三六九等!众所周知,无线通信的发展,最核心的诉求就是要解决人民日益增长的网速需求和空口能力不足的矛盾。正是因为这样强大的驱动力,移动通信从1G发展到了4G,5G时代也已含苞待放。通信这事本来
什么是5G工业互联网?一。从消费互联网到工业互联网在这个互联网如我们生活中的水和电一样无孔不入的时代,不能联网的设备是可耻的。它们像是一个一个的信息孤岛,原始而静寂。然而50年前,这样的信息孤岛却是这个