157、在系统中查找重复文件
题目描述:
给定一个目录信息列表,包括目录路径,以及该目录中的所有包含内容的文件,您需要找到文件系统中的所有重复文件组的路径。一组重复的文件至少包括二个具有完全相同内容的文件。
输入列表中的单个目录信息字符串的格式如下:
“root/d1/d2/…/dm f1.txt(f1_content) f2.txt(f2_content) … fn.txt(fn_content)”
这意味着有 n 个文件(f1.txt, f2.txt … fn.txt 的内容分别是 f1_content, f2_content … fn_content)在目录 root/d1/d2/…/dm 下。注意:n>=1 且 m>=0。如果 m=0,则表示该目录是根目录。
该输出是重复文件路径组的列表。对于每个组,它包含具有相同内容的文件的所有文件路径。文件路径是具有下列格式的字符串:
“directory_path/file_name.txt”
示例 1:
输入:
[“root/a 1.txt(abcd) 2.txt(efgh)”, “root/c 3.txt(abcd)”, “root/c/d 4.txt(efgh)”, “root 4.txt(efgh)”]
输出:
[[“root/a/2.txt”,“root/c/d/4.txt”,“root/4.txt”],[“root/a/1.txt”,“root/c/3.txt”]]
注:
最终输出不需要顺序。
您可以假设目录名、文件名和文件内容只有字母和数字,并且文件内容的长度在 [1,50] 的范围内。
给定的文件数量在 [1,20000] 个范围内。
您可以假设在同一目录中没有任何文件或目录共享相同的名称。
您可以假设每个给定的目录信息代表一个唯一的目录。目录路径和文件信息用一个空格分隔。
超越竞赛的后续行动:
假设您有一个真正的文件系统,您将如何搜索文件?广度搜索还是宽度搜索?
如果文件内容非常大(GB级别),您将如何修改您的解决方案?
如果每次只能读取 1 kb 的文件,您将如何修改解决方案?
修改后的解决方案的时间复杂度是多少?其中最耗时的部分和消耗内存的部分是什么?如何优化?
如何确保您发现的重复文件不是误报?
定义一个map用于存储路径文件对应的内容,定义一个time定义内容出现的次数(减少循环的次数),首先将所给的String数组进行处理,将路径和内容放进map中,需要注意的是以空格分隔过后内容可能不止一个,当然索引的0肯定是路径。
class Solution {public List<List<String>> findDuplicate(String[] paths) {List<List<String>> result = new ArrayList<>();Map<String, String> map = new HashMap<>();List<String> newpath = new ArrayList<>();Map<String, Integer> time = new HashMap<>();// 获取内容Set<String> content = new HashSet<>();for (int i = 0; i < paths.length; i++) {String temString = paths[i];String tem[] = temString.split(" ");System.out.println(Arrays.toString(tem));for (int j = 1; j < tem.length; j++) {String contents = tem[j].substring(tem[j].indexOf("(") + 1,tem[j].length() - 1);content.add(contents);String path = tem[0] + "/" + tem[j].substring(0,tem[j].indexOf("("));map.put(path, contents);time.put(contents, time.getOrDefault(contents, 0) + 1);newpath.add(path);}}for (int i = 0; i < newpath.size(); i++) {String tempath = newpath.get(i);List<String> list = new ArrayList<>();if(content.contains(map.get(tempath)) && time.get(map.get(tempath)) > 1){content.remove(map.get(tempath));String temcontent = map.get(tempath);for (int j = i; j < newpath.size(); j++) {if(map.get(newpath.get(j)).equals(temcontent)){list.add(newpath.get(j));}}if(list.size() >= 2){result.add(list);}}}return result; }
}
其实可以换个思路:将内容作为key,value是所有路径的集合,那么这样就一个循环即可,代码:
class Solution {public List<List<String>> findDuplicate(String[] paths) {List<List<String>> result = new ArrayList<>();
// 内容对应的是路径Map<String, List<String>> map = new HashMap<>();Map<String, Integer> time = new HashMap<>();// 获取内容Set<String> content = new HashSet<>();for (int i = 0; i < paths.length; i++) {String temString = paths[i];
// tem[0]为路径,之后为内容String tem[] = temString.split(" ");System.out.println(Arrays.toString(tem));for (int j = 1; j < tem.length; j++) {
// 获取所有的内容,将内容作为key,value为路径的集合// 文件名:int indexleft = tem[j].indexOf("(");String filename = tem[j].substring(0,indexleft);String filedire = tem[0] + "/" + filename;String filecontext = tem[j].substring(indexleft + 1,tem[j].length() - 1);if(!map.containsKey(filecontext)){map.put(filecontext, new ArrayList<>());}map.get(filecontext).add(filedire);}}for (Map.Entry<String, List<String>> tem : map.entrySet()) {if(tem.getValue().size() > 1){result.add(tem.getValue());}}return result;}
}
157、在系统中查找重复文件相关推荐
- Java实现 LeetCode 609 在系统中查找重复文件(阅读理解+暴力大法)
609. 在系统中查找重复文件 给定一个目录信息列表,包括目录路径,以及该目录中的所有包含内容的文件,您需要找到文件系统中的所有重复文件组的路径.一组重复的文件至少包括二个具有完全相同内容的文件. 输 ...
- LeetCode 609. 在系统中查找重复文件(哈希)
1. 题目 给定一个目录信息列表,包括目录路径,以及该目录中的所有包含内容的文件,您需要找到文件系统中的所有重复文件组的路径. 一组重复的文件至少包括二个具有完全相同内容的文件. 输入列表中的单个目录 ...
- 在系统中查找重复文件
给定一个目录信息列表,包括目录路径,以及该目录中的所有包含内容的文件,您需要找到文件系统中的所有重复文件组的路径.一组重复的文件至少包括二个具有完全相同内容的文件. 输入列表中的单个目录信息字符串的格 ...
- 在linux中查找重复的文件夹,如何在Linux上找出并删除重复的文件:FSlint
大家好,今天我们会学习如何在Linux PC或者服务器上找出和删除重复文件.这里有一款工具你可以工具自己的需要使用. 无论你是否正在使用Linux桌面或者服务器,有一些很好的工具能够帮你扫描系统中的重 ...
- linux查找最近访问的文件,教您在Linux系统中查找最近修改的文件/文件夹
如果您使用Linux系统进行日常操作,则主目录文件将随时间急剧增加.如果您有成千上万个文件,很可能不记得最近更改的文件名,本文将教您在Linux系统中查找最近修改的文件/文件夹.另外,如果要检查出于任 ...
- linux 查找只读文件夹,Linux系统中查找命令find的使用方法(二)
今天达内Linux培训小编要继续跟大家分享关于Linux系统中中查找命令find的使用方法的文章.在上文中小编提到,Linux查找命令是Linux系统中很重要也是很常用的命令之一.Linux的查找命令 ...
- php检测txt中重复数据,Python实现检测文件的MD5值来查找重复文件案例
平时学生交上机作业的时候经常有人相互复制,直接改文件名了事,为了能够简单的检测这种作弊行为,想到了检测文件的MD5值,虽然对于抄袭来说作用不大,但是聊胜于无,以后可以做一个复杂点的. # coding ...
- 利用 Linux 查找重复文件
方法一:使用Find命令 本部分算是对find强大功能的扩展使用方法说明.在find的基础上,我们可与(如xargs命令)等其它基本Linux命令相结合,即能创造出无限的命令行功能,比如:可以快速查找 ...
- 硬盘快满了,怎么办?查找重复文件
硬盘快满了,怎么办?查找重复文件,绿色版 链接:https://pan.baidu.com/s/1nbhRhninawNLK5CHZfanWA 提取码:yu37 序列号 TDFP-XWAL-EPNX- ...
最新文章
- Grid SearchCV(网格搜索)与RandomizedSearchCV (随机搜索) 贴近实践的
- 工作中系统报错:数据库连接失败怎么办?
- linux安装mysql、卸载mysql、设置mysql
- 从零写一个编译器(十一):代码生成之Java字节码基础
- SAP Spartacus cxOutlet里的元数据存储,outlet名称和待渲染Component的映射关系
- python中怎么调用函数_浅谈Python中函数的定义及其调用方法
- Windows和linux提权方法,Windows与Linux本地用户提权体验(一)
- python的第三方库是干什么用的-python标准库和第三方库的区别
- 17. Contoller(2)
- perf-应用程序的调优与使用
- 公寓式楼房宜南北走向
- (附源码)Springboot通用办事流程管理软件 毕业设计 211819
- PC-电源-001--什么是80 PLUS,金牌换钛金电源能回本吗?
- APS Interview - Operating System
- 【论文阅读】PatchmatchNet
- 查看计算机内存过高,物理内存过高怎么办,小编教你电脑物理内存过高怎么办...
- 将js中Ajax设置为同步请求
- Optimized Cost per Click in Taobao Display Advertising-oCPC 店商广告投放经典论文
- matlab中画圆圈,如何在Matlab中绘制圆圈?
- 【每日早报】2019/09/27
热门文章
- windows linux 子系统 wsl体验
- css实现车轨动画转弯,css3实现沿椭圆轨迹旋转动画
- 苹果电脑用不用TCP/IP协议?
- linux 测试路由速度慢,LINUX服务器性能常用测试脚本 – 硬件信息/网速/延迟/路由等...
- 四月嗅花 - 江湖一剑客
- 功能机手感的三防手机,还可以刷抖音,AGM M7体验
- linux键盘修复,linux和macos_如何在macOS和Linux上修复Corsair鼠标和键盘问题
- 【转载】界面设计测试规范
- CocosCreator+TS动态创建模型(扇形区域)
- js blob转json