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

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

原题链接:

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

https://leetcode.cn/problems/find-duplicate-file-in-system/description/

完成情况:

解题思路:

复制代码
    		/**
	 解释题目:
	    题目就是说,给了很多个文件路径(包括文件名),以及文件内容
	    要求你把文件内容相同的文件路径(包括文件名),放在同一个List里。

	 解题思路:
	 List<List<String>>结果
	 要用到HashMap,key去存文件内容,value去存文件路径(包括文件名)

	 然后就是输入的是String[] paths
	 即["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 1.txt(abcd) 2.txt(efgh)
	 即空格space表示到头了,1.txt表示文件名       需要split掉()来获取value
	 同时记录到的文件名,都得转换成root/a 1.txt,root/a 2.txt这样的形式
	 */

参考代码:

java 复制代码
package 西湖算法题解___中等题;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class __609在系统中查找重复文件 {
	public List<List<String>> findDuplicate(String[] paths) {
		/**
		 解释题目:
		    题目就是说,给了很多个文件路径(包括文件名),以及文件内容
		    要求你把文件内容相同的文件路径(包括文件名),放在同一个List里。

		 解题思路:
		 List<List<String>>结果
		 要用到HashMap,key去存文件内容,value去存文件路径(包括文件名)

		 然后就是输入的是String[] paths
		 即["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 1.txt(abcd) 2.txt(efgh)
		 即空格space表示到头了,1.txt表示文件名       需要split掉()来获取value
		 同时记录到的文件名,都得转换成root/a 1.txt,root/a 2.txt这样的形式
		 */
		HashMap<String,List<String>> map = new HashMap<>();
		for (String path:paths){
			//用空格space进行分隔
			String keyValues[] = path.split(" ");
			int keyValues_Length = keyValues.length;
			//从上图的分析,我们可以知道,keyValues[0]即是对应的value,当然了还不全是,还得加上具体的文件名才行
			//接下来应该分离出具体的单个文件名,以及他们对应的key值,文件名则去组成我们需要的value值。
			for (int i = 1;i<keyValues_Length;i++){
				//                                  split左括号,需要转义
				String [] name_cont = keyValues[i].split("\\(");
				//      root/a 1.txt    abcd 2.txt     efgh
				name_cont[1] = name_cont[1].replace(")","");
				List <String> list = map.getOrDefault(name_cont[1],new ArrayList<String>());
				list.add(keyValues[0]+"/"+name_cont[0]);
				map.put(name_cont[1],list);
			}
		}
		List<List<String>> res = new ArrayList<List<String>>();
		for (String key : map.keySet()){
			if (map.get(key).size() > 1){
				res.add(map.get(key));
			}
		}
		return res;
	}
}
相关推荐
进击的荆棘9 分钟前
C++起始之路——类和对象(下)
开发语言·c++
帅得不敢出门14 分钟前
精简Android SDK(AOSP)的git项目提高git指令速度
android·java·开发语言·git·elasticsearch
liu****15 分钟前
10.排序
c语言·开发语言·数据结构·c++·算法·排序算法
爱写Bug的小孙15 分钟前
Tools、MCP 和 Function Calling
开发语言·人工智能·python·ai·ai编程·工具调用
青蛙大侠公主15 分钟前
Spring事务
java·数据库·spring
小小Fred17 分钟前
FreeRTOS函数prvInitialiseNewTask解析
java·开发语言
图表制作解说(目标1000个图表)19 分钟前
Java通过BACnet协议读取和写入设备信息
java·楼宇自控·bacnet协议
老华带你飞20 分钟前
校务管理|基于springboot 校务管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·spring
_OP_CHEN22 分钟前
【算法基础篇】(三十二)动态规划之背包问题扩展:从多重到多维,解锁背包问题全场景
c++·算法·蓝桥杯·动态规划·背包问题·算法竞赛·acm/icpc
利刃大大24 分钟前
【JavaSE】十一、Stack && Queue && Deque && PriorityQueue && Map && Set
java·数据结构·优先级队列··哈希表·队列·集合类