在系统中查找重复文件

简介: 在系统中查找重复文件

说在前面

🎈不知道大家对于算法的学习是一个怎样的心态呢?为了面试还是因为兴趣?不管是出于什么原因,算法学习需要持续保持。

一、题目描述

给你一个目录信息列表 paths ,包括目录路径,以及该目录中的所有文件及其内容,请你按路径返回文件系统中的所有重复文件。答案可按 任意顺序 返回。

一组重复的文件至少包括 两个 具有完全相同内容的文件。

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

“root/d1/d2/…/dm f1.txt(f1_content) f2.txt(f2_content) … fn.txt(fn_content)”

这意味着,在目录 root/d1/d2/…/dm 下,有 n 个文件 ( f1.txt, f2.txt … fn.txt ) 的内容分别是 ( f1_content, f2_content … fn_content ) 。注意:n >= 1 且 m >= 0 。如果 m = 0 ,则表示该目录是根目录。

输出 是由 重复文件路径组 构成的列表。其中每个组由所有具有相同内容文件的文件路径组成。文件路径是具有下列格式的字符串:

“directory_path/file_name.txt”

示例1

输入: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/2.txt","root/c/d/4.txt","root/4.txt"],["root/a/1.txt","root/c/3.txt"]]

示例2

输入:paths = ["root/a 1.txt(abcd) 2.txt(efgh)","root/c 3.txt(abcd)","root/c/d 4.txt(efgh)"]
输出:[["root/a/2.txt","root/c/d/4.txt"],["root/a/1.txt","root/c/3.txt"]]

二、思路分析

本题的输入格式为一个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和2.txt,1.txt的文件内容为’abcd’,2.txt的文件内容为’efgh’;
  • root/c/d目录下有一个文件4.txt,内容为’efgh’;
  • root目录下有一个文件4.txt,内容为’efgh’。
    题目需要我们找出的是文件内容相同的文件列表,即我们需要找到文件内容相同的不同文件,并将其完整路径放入一个列表中。
    看到这里,我们不难发现可以使用map哈希表来解决这道题目。
  • 1、定义一个哈希表contentMap用来存放文件列表,key为文件内容,value为文件路径列表;
let contentMap = {};
  • 2、遍历输入参数paths,读取每一个目录下的文件;
for(let i = 0; i < paths.length; i++){
    let path = paths[i].split(' ');
    for(let j = 1; j < path.length; j++){
        let file = path[j].split(/\(|\)/g);
        const arr = contentMap[file[1]] || [];
        arr.push(path[0] + '/' + file[0]);
        contentMap[file[1]] = arr;
    }
}
  • 3、通过文件内容把每一个目录下的文件放进contentMap哈希表中去;
    let file = path[j].split(/\(|\)/g);通过 /(|)/ 可以分隔出文件路径和文件内容。
let path = paths[i].split(' ');
for(let j = 1; j < path.length; j++){
    let file = path[j].split(/\(|\)/g);
    const arr = contentMap[file[1]] || [];
    arr.push(path[0] + '/' + file[0]);
    contentMap[file[1]] = arr;
}
  • 4、遍历哈希表contentMap,将文件路径列表大于2个的存放到返回结果中。
let res = [];
for(let k in contentMap){
    if(contentMap[k].length > 1){
        res.push(contentMap[k]);
    }
}

三、AC代码

/**
 * @param {string[]} paths
 * @return {string[][]}
 */
var findDuplicate = function(paths) {
    let contentMap = {};
    for(let i = 0; i < paths.length; i++){
        let path = paths[i].split(' ');
        for(let j = 1; j < path.length; j++){
            let file = path[j].split(/\(|\)/g);
            const arr = contentMap[file[1]] || [];
            arr.push(path[0] + '/' + file[0]);
            contentMap[file[1]] = arr;
        }
    }
    let res = [];
    for(let k in contentMap){
        if(contentMap[k].length > 1){
            res.push(contentMap[k]);
        }
    }
    return res;
};

公众号

关注公众号『前端也能这么有趣』,获取更多有趣内容。

说在后面

🎉 这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 🏸 ,平时也喜欢写些东西,既为自己记录 📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 🙇,写错的地方望指出,定会认真改进 😊,偶尔也会在自己的公众号『前端也能这么有趣』发一些比较有趣的文章,有兴趣的也可以关注下。在此谢谢大家的支持,我们下文再见 🙌。

目录
相关文章
|
5月前
|
算法 Linux Windows
Linux|如何查找和删除重复文件
Linux|如何查找和删除重复文件
61 1
|
5月前
|
机器学习/深度学习 Python
获取重复的文件
使用 Python 3.10+ 的程序找出图片样本中的重复文件,依赖包 `NStudyPy`。通过计算文件的 MD5 值来识别重复项。核心函数 `get_repeat_file` 接受路径和递归选项,返回一个字典,键为 MD5,值为相同 MD5 的文件列表。`get_file_list` 和 `get_md5` 函数留待后续解释。安装 `NStudyPy`:`pip install -U NStudyPy`。
37 2
|
6月前
查找数据
查找数据。
36 1
|
算法
查找
查找是指在图中寻找特定的节点或边的过程。在图中进行查找操作可以帮助我们找到与目标节点或边相关的信息,或者判断图中是否存在某个节点或边。 在图中进行查找操作的常见算法有: 1. 深度优先搜索(DFS):从图中的一个节点开始,沿着一条路径一直深入直到无法再深入为止,然后回溯到上一个节点,继续深入其他路径,直到找到目标节点或遍历完所有节点。 2. 广度优先搜索(BFS):从图中的一个节点开始,先访问它的所有邻居节点,然后再依次访问邻居的邻居节点,直到找到目标节点或遍历完所有节点。 3. Dijkstra算法:用于在带权有向图中找到从一个节点到其他节点的最短路径。该算法通过不断更新节点的最短距离来逐步
74 0
|
存储 算法 项目管理
|
SQL Python
【通用文件操作】查找重复文件
在前一篇我们以及说了如何搜索文件,详细查看【通用文件操作】文件搜索。今天我们来看看如何查找重复文件。在我们微信、QQ中,经常会我们每发送一次文件就会给我们在本地保存一份。我们可以使用今天的内容来实现重复文件的删除。
530 0
|
存储 机器学习/深度学习 算法
如何更快速地查找
查找算法在计算机程序设计中占据着主要的核心位置,查找算法的效率直接影响着计算机程序设计与开发的结果与速度。本章主要会讲到顺序查找、二分查找、索引查找和哈希查找这四种查找算法以及效率分析。掌握了相关查找算法,不管是在代码编程计算机技术上面,还在日常生活中都会有很大的用处。
265 0
如何更快速地查找
|
存储 算法 Java
练习2—数据查找
练习2—数据查找
101 0
|
测试技术
简单查找
给定一个集合,查找元素是否在集合中出现。
127 0