LeetCode刷题实战588设计内存文件系统
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选!
今天和大家聊的问题叫做设计内存文件系统,我们先来看题面:
https:leetcodecn。comproblemsdesigninmemoryfilesystem
Designaninmemoryfilesystemtosimulatethefollowingfunctions:
ls:Givenapathinstringformat。Ifitisafilepath,returnalistthatonlycontainsthisfilesname。Ifitisadirectorypath,returnthelistoffileanddirectorynamesinthisdirectory。Youroutput(fileanddirectorynamestogether)shouldinlexicographicorder。
mkdir:Givenadirectorypaththatdoesnotexist,youshouldmakeanewdirectoryaccordingtothepath。Ifthemiddledirectoriesinthepathdontexisteither,youshouldcreatethemaswell。Thisfunctionhasvoidreturntype。
addContentToFile:Givenafilepathandfilecontentinstringformat。Ifthefiledoesntexist,youneedtocreatethatfilecontaininggivencontent。Ifthefilealreadyexists,youneedtoappendgivencontenttooriginalcontent。Thisfunctionhasvoidreturntype。
readContentFromFile:Givenafilepath,returnitscontentinstringformat。
设计一个内存文件系统,模拟以下功能:
ls:以字符串的格式输入一个路径。如果它是一个文件的路径,那么函数返回一个列表,仅包含这个文件的名字。如果它是一个文件夹的的路径,那么返回该文件夹内的所有文件和子文件夹的名字。你的返回结果(包括文件和子文件夹)应该按字典序排列。
mkdir:输入一个当前不存在的文件夹路径,你需要根据路径名创建一个新的文件夹。如果有上层文件夹路径不存在,那么你也应该将它们全部创建。这个函数的返回类型为void。
addContentToFile:输入字符串形式的文件路径和文件内容。如果文件不存在,你需要创建包含给定文件内容的文件。如果文件已经存在,那么你需要将给定的文件内容追加在原本内容的后面。这个函数的返回类型为void。
readContentFromFile:输入文件路径,以字符串形式返回该文件的内容。示例输入:
〔FileSystem,ls,mkdir,addContentToFile,ls,readContentFromFile〕
〔〔〕,〔〕,〔abc〕,〔abcd,hello〕,〔〕,〔abcd〕〕
输出:
〔,〔〕,,,〔a〕,hello〕解题
https:www。cnblogs。comgrandyangp6944331。html
这道题让我们设计一个内存文件系统,实现显示当前文件,创建文件,添加内容到文件,读取文件内容等功能,感觉像是模拟一个terminal的一些命令。这道题比较tricky的地方是ls这个命令,题目中的例子其实不能很好的展示出ls的要求,其对文件和文件夹的处理方式是不同的。由于这里面的文件没有后缀,所以最后一个字符串有可能是文件,也有可能是文件夹。比如abc,那么最后的c有可能是文件夹,也有可能好是文件,如果c是文件夹的话,ls命令要输出文件夹c中的所有文件和文件夹,而当c是文件的话,只需要输出文件c即可。另外需要注意的是在创建文件夹的时候,路径上没有的文件夹都要创建出来,还有就是在给文件添加内容时,路径中没有的文件夹都要创建出来。论坛上这道题的高票解法都新建了一个自定义类,但是博主一般不喜欢用自定义类来解题,而且感觉那些使用了自定义类的解法并没有更简洁易懂,所以这里博主就不创建自定义类了,而是使用两个哈希表来做,其中dirs建立了路径和其对应的包含所有文件和文件夹的集合之间的映射,files建立了文件的路径跟其内容之间的映射。
最开始时将根目录放入dirs中,然后看ls的实现方法,如果该路径存在于files中,说明最后一个字符串是文件,那么我们将文件名取出来返回即可,如果不存在,说明最后一个字符串是文件夹,那么我们到dirs中取出该文件夹内所有的东西返回即可。再来看mkdir函数,我们的处理方法就是根据来分隔分隔字符串,如果是Java,那么直接用String自带的split函数就好了,但是C没有Java那么多自带函数,所以只能借助字符串流类来处理,处理方法就是将每一层的路径分离出来,然后将该层的文件或者文件夹加入对应的集合中,注意的地方就是处理根目录时,要先加上,其他情况都是后加。下面来看addContentToFile函数,首先分离出路径和文件名,如果路径为空,说明是根目录,需要加上,然后看这个路径是否已经在dirs中存在,如果不存在,调用mkdir来创建该路径,然后把文件加入该路径对应的集合中,再把内容加入该文件路径的映射中。最后的读取文件内容就相当简单了,直接在files中返回即可,参见代码如下:classFileSystem{
public:
FileSystem{
dirs〔〕;
}
vectorls(stringpath){
if(files。count(path)){
intidxpath。findlastof();
return{path。substr(idx1)};
}
autotdirs〔path〕;
returnvector(t。begin,t。end);
}
voidmkdir(stringpath){
istringstreamis(path);
stringt,dir;
while(getline(is,t,)){
if(t。empty)continue;
if(dir。empty)dir;
dirs〔dir〕。insert(t);
if(dir。size1)dir;
dirt;
}
}
voidaddContentToFile(stringfilePath,stringcontent){
intidxfilePath。findlastof();
stringdirfilePath。substr(0,idx);
stringfilefilePath。substr(idx1);
if(dir。empty)dir;
if(!dirs。count(dir))mkdir(dir);
dirs〔dir〕。insert(file);
files〔filePath〕。append(content);
}
stringreadContentFromFile(stringfilePath){
returnfiles〔filePath〕;
}
private:
unorderedmapstring,setdirs;
unorderedmapstring,stringfiles;
};
在看或者转发吧,你们的支持是我最大的动力。
上期推文:
LeetCode1580题汇总,希望对你有点帮助!
LeetCode刷题实战581:最短无序连续子数组
LeetCode刷题实战582:杀掉进程
LeetCode刷题实战583:两个字符串的删除操作
LeetCode刷题实战584:寻找用户推荐人
LeetCode刷题实战585:2016年的投资
LeetCode刷题实战586:订单最多的客户
LeetCode刷题实战587:安装栅栏
证监会鼓励相关机构在不损害投资者利益的前提下开展行业网络安全昝秀丽中国证券报中证网中证网讯(记者昝秀丽)证监会4月29日消息,证监会起草了《证券期货业网络安全管理办法(征求意见稿)》(以下简称《办法》),并向社会公开征求意见。……
证监会鼓励相关机构在不损害投资者利益的前提下开展行业网络安全【证监会:鼓励相关机构在不损害投资者利益的前提下开展行业网络安全技术应用】财联社4月29日电,证监会就《证券期货业网络安全管理办法(征求意见稿)》公开征求意见。在网络安全促进与……
北京银保监局政策性农业保险充分利用互联网技术不断优化服务流程北京商报讯(记者陈婷婷胡永新)4月27日,北京商报记者从北京银保监局获悉,2021年北京农业保险综合费用率仅12。7,低于全国平均水平6。4个百分点;综合赔付率高于全国平均水平……
关于公园一日游的作文作文一:海洋公园一日游一大早,通往海洋世界的大巴上,就传出了六(8)班的歌声。时间想乌龟一样爬走了,我们像兔子一样下了车,然后想蜗牛一样站好队。眼前的景象还是老样子,但是……
为什么会这样为什么会这样?你难道看不到眼前的垃圾吗?那你为什么故意偏离视角,真的闻不到吗?那你为什么要捂住鼻子,这其中,难道没有你扔的垃圾吗?明明就在一个垃圾桶旁,可你为什么就是投不……
坚持原则之我见的高中作文生活事事离不开原则。战场上,军规是打仗的原则。交通中,规章制度是行驶的原则。既然如此,我们便要正确地坚持原则。为此,我们就要做到三个方面。第一,坚……
下雪后学校的日记300字下雪后学校的日记300字1雪后的校园又美又欢乐。看,那笔直的水泥路上已经盖上了一条长长的白地毯,那么纯洁,那么晶莹,看的真叫人不忍心踩上去。路两旁便是两排挺拔的水杉……
和我的世界有关的作文横七竖八我的世界里,人很多,所以噪音污染严重。很多时候,我都不太搭理别人,我想别人也不把我当根葱,以为这样会安静,但人都横七竖八地躺在我抬头不见低头见的视野里,所以,依然……
春天又到了初中作文700字柳枝染上了嫩绿,在春风里尽情摇摆。清晨,我踏着缥缈的薄雾,来到了田野。田野里,到处长着碧绿的小草,显得安详宁静。四月的春天就应该有这样的绿。忽然,我看见草丛中有一点嫩绿在阳光的……
有关初中感恩父母的作文600字锦集8篇在学习、工作或生活中,大家对作文都不陌生吧,通过作文可以把我们那些零零散散的思想,聚集在一块。作文的注意事项有许多,你确定会写吗?以下是小编为大家收集的初中感恩父母的作文600……
小学五年级优秀作文期中反思400字《第一篇》考试后,我最关心的莫过于各门课的成绩了,可成绩并不是怎么样,语文84、数学97、英语99。其实分数不过是对我们这一个学期的一个评价,考完后并不应该盯着他,而是要……
冷色与暖色世界就像一个彩色的颜料盘,生活就像盘上色彩缤纷的颜料。我们的生活多姿多彩,组成了多彩的世界。颜色为中有冷色也有暖色。马路是灰色的,斑马线是白色的。有多少鲜血的红色洒在这一片灰色……
高三优秀作文你是我一生的陪伴小时候,由我家到院中,母亲需要十一步。记忆中每一个黄昏,总会有两条长短不一的影子,长影子扶着短影子,一步一步练习走路,豆大的汗珠从长影子额头滑下,但似乎短影子全然不知,依……
放开自己优秀作文放开自己,让自己的心灵去旅行。小编给大家精心推荐三篇放开自己优秀作文,希望大家喜欢!放开自己优秀作文1回忆过去,突然觉得过去的我好像一直在一个伪装自己的时代里,这些……
冬日家乡风景图作文今年冬天,我来到了水网密布的家乡。也许看惯了城里生活,家乡的风光也别有一番风韵。家乡的冬天很美,但没有雪花飞扬的风雅景色,大雪遍地的壮丽风光,惟有那一条条清秀的小河,一座……
一封信的旅途作文400字在一座多多岛上,有一封信无奈地飞着,一直没有邮递员来领取。一天,一股强劲有力的风把它吹到了这里,那正是爱米小姐昨天放进邮箱里的,这一切让两个捣蛋鬼发现了,那天深夜,他们将邮箱弄……
人教版九年级上册二单元作文微笑面对失败人的一生中,都要经历很多件事。其中,不乏失败的事。面对失败,不同的人会有不同的态度。有些人一听说做什么事失败了,马上就一蹶不振,整天自暴自弃;而另一些人则不同,面对失败,他们总……
遇到挫折时作文范文人生中,处处都有挫折的时候。有时,你遇到它,你会倒退。有时会勇敢地去战胜它。当你面对挫折时决定去放弃它,而有人去鼓励你去战胜,去打倒它。当我面对挫折的时候,都有他陪伴着我,不管……
我的启蒙老师小学生作文范文篇一:我的启蒙老师时光如流水,转眼间的功夫,我已经是六年级的学生了,回过头来想我小时候的事,有些已经忘记了,唯独那个人和那件事,在我记忆的深处还总是那么清晰,使得我难以忘……
python之枚举类型1简介枚举是在Python3。4添加的新功能。Python3。4之前的版本可以使用,但是不能直接使用,使用之前需要先用pipinstallenum安装。1。1什么是……
python之快捷键篇一、编辑(Editing)CtrlSpace基本的代码完成(类、方法、属性)CtrlAltSpace快速导入任意类CtrlShiftEnter语句完成CtrlP参数信息(在方法……
优秀作文小学生活快乐的小学生活就要结束了,我却有种快乐的感觉,因为我解脱了,我终于不再那种窝囊的集体里生活了,小学生活作文。在一二年级的时候,我不懂得什么叫肮脏,因为那时的我只是一张白纸……
保护碧水蓝天,共建绿色家园转载让我们用自己的实际行动维护环境,增强我们的绿色意识,为珍惜绿色、维护环境献出自己的一份力量!让我们一起去维护碧水蓝天,共建绿色家园吧!共建绿色家园,维护碧水蓝天万物……
欧盟新数字法加强科技巨头监管,若违规可能面临数十亿美元罚款来源:环球时报【环球时报综合报道】欧盟23日就新的数字法规达成一致,将迫使谷歌和脸书母公司Meta等科技巨头更积极地监管其平台上的非法内容,否则可能面临数十亿美元的罚款。……