题目描述:
给定一个目录信息列表,包括目录路径,以及该目录中的所有包含内容的文件,您需要找到文件系统中的所有重复文件组的路径。一组重复的文件至少包括二个具有完全相同内容的文件。

输入列表中的单个目录信息字符串的格式如下:

“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、在系统中查找重复文件相关推荐

  1. Java实现 LeetCode 609 在系统中查找重复文件(阅读理解+暴力大法)

    609. 在系统中查找重复文件 给定一个目录信息列表,包括目录路径,以及该目录中的所有包含内容的文件,您需要找到文件系统中的所有重复文件组的路径.一组重复的文件至少包括二个具有完全相同内容的文件. 输 ...

  2. LeetCode 609. 在系统中查找重复文件(哈希)

    1. 题目 给定一个目录信息列表,包括目录路径,以及该目录中的所有包含内容的文件,您需要找到文件系统中的所有重复文件组的路径. 一组重复的文件至少包括二个具有完全相同内容的文件. 输入列表中的单个目录 ...

  3. 在系统中查找重复文件

    给定一个目录信息列表,包括目录路径,以及该目录中的所有包含内容的文件,您需要找到文件系统中的所有重复文件组的路径.一组重复的文件至少包括二个具有完全相同内容的文件. 输入列表中的单个目录信息字符串的格 ...

  4. 在linux中查找重复的文件夹,如何在Linux上找出并删除重复的文件:FSlint

    大家好,今天我们会学习如何在Linux PC或者服务器上找出和删除重复文件.这里有一款工具你可以工具自己的需要使用. 无论你是否正在使用Linux桌面或者服务器,有一些很好的工具能够帮你扫描系统中的重 ...

  5. linux查找最近访问的文件,教您在Linux系统中查找最近修改的文件/文件夹

    如果您使用Linux系统进行日常操作,则主目录文件将随时间急剧增加.如果您有成千上万个文件,很可能不记得最近更改的文件名,本文将教您在Linux系统中查找最近修改的文件/文件夹.另外,如果要检查出于任 ...

  6. linux 查找只读文件夹,Linux系统中查找命令find的使用方法(二)

    今天达内Linux培训小编要继续跟大家分享关于Linux系统中中查找命令find的使用方法的文章.在上文中小编提到,Linux查找命令是Linux系统中很重要也是很常用的命令之一.Linux的查找命令 ...

  7. php检测txt中重复数据,Python实现检测文件的MD5值来查找重复文件案例

    平时学生交上机作业的时候经常有人相互复制,直接改文件名了事,为了能够简单的检测这种作弊行为,想到了检测文件的MD5值,虽然对于抄袭来说作用不大,但是聊胜于无,以后可以做一个复杂点的. # coding ...

  8. 利用 Linux 查找重复文件

    方法一:使用Find命令 本部分算是对find强大功能的扩展使用方法说明.在find的基础上,我们可与(如xargs命令)等其它基本Linux命令相结合,即能创造出无限的命令行功能,比如:可以快速查找 ...

  9. 硬盘快满了,怎么办?查找重复文件

    硬盘快满了,怎么办?查找重复文件,绿色版 链接:https://pan.baidu.com/s/1nbhRhninawNLK5CHZfanWA 提取码:yu37 序列号 TDFP-XWAL-EPNX- ...

最新文章

  1. Grid SearchCV(网格搜索)与RandomizedSearchCV (随机搜索) 贴近实践的
  2. 工作中系统报错:数据库连接失败怎么办?
  3. linux安装mysql、卸载mysql、设置mysql
  4. 从零写一个编译器(十一):代码生成之Java字节码基础
  5. SAP Spartacus cxOutlet里的元数据存储,outlet名称和待渲染Component的映射关系
  6. python中怎么调用函数_浅谈Python中函数的定义及其调用方法
  7. Windows和linux提权方法,Windows与Linux本地用户提权体验(一)
  8. python的第三方库是干什么用的-python标准库和第三方库的区别
  9. 17. Contoller(2)
  10. perf-应用程序的调优与使用
  11. 公寓式楼房宜南北走向
  12. (附源码)Springboot通用办事流程管理软件 毕业设计 211819
  13. PC-电源-001--什么是80 PLUS,金牌换钛金电源能回本吗?
  14. APS Interview - Operating System
  15. 【论文阅读】PatchmatchNet
  16. 查看计算机内存过高,物理内存过高怎么办,小编教你电脑物理内存过高怎么办...
  17. 将js中Ajax设置为同步请求
  18. Optimized Cost per Click in Taobao Display Advertising-oCPC 店商广告投放经典论文
  19. matlab中画圆圈,如何在Matlab中绘制圆圈?
  20. 【每日早报】2019/09/27

热门文章

  1. windows linux 子系统 wsl体验
  2. css实现车轨动画转弯,css3实现沿椭圆轨迹旋转动画
  3. 苹果电脑用不用TCP/IP协议?
  4. linux 测试路由速度慢,LINUX服务器性能常用测试脚本 – 硬件信息/网速/延迟/路由等...
  5. 四月嗅花 - 江湖一剑客
  6. 功能机手感的三防手机,还可以刷抖音,AGM M7体验
  7. linux键盘修复,linux和macos_如何在macOS和Linux上修复Corsair鼠标和键盘问题
  8. 【转载】界面设计测试规范
  9. CocosCreator+TS动态创建模型(扇形区域)
  10. js blob转json