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

目录

  • 题目描述:
  • 示例 1:
  • 解法:

题目描述:

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

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

"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. 最终输出不需要顺序。
  2. 您可以假设目录名、文件名和文件内容只有字母和数字,并且文件内容的长度在 [1,50] 的范围内。
  3. 给定的文件数量在 [1,20000] 个范围内。
  4. 您可以假设在同一目录中没有任何文件或目录共享相同的名称。
  5. 您可以假设每个给定的目录信息代表一个唯一的目录。目录路径和文件信息用一个空格分隔。

超越竞赛的后续行动:

  1. 假设您有一个真正的文件系统,您将如何搜索文件?广度搜索还是宽度搜索?
  2. 如果文件内容非常大(GB级别),您将如何修改您的解决方案?
  3. 如果每次只能读取 1 kb 的文件,您将如何修改解决方案?
  4. 修改后的解决方案的时间复杂度是多少?其中最耗时的部分和消耗内存的部分是什么?如何优化?
  5. 如何确保您发现的重复文件不是误报?

解法:

class Solution {
public:
    void parse(string& s, unordered_map<string, vector<string>>& mp){
        int sz = s.size();
        int i = 0;
        while(i < sz && s[i] != ' '){
            i++;
        }
        string dir = s.substr(0, i);
        i++;
        int j = i;
        while(i < sz){
            while(j < sz && s[j] != ' '){
                j++;
            }
            int l = i;
            while(l < j && s[l] != '('){
                l++;
            }
            string fname = s.substr(i, l - i);
            l++;
            int r = l;
            while(r < sz && s[r] != ')'){
                r++;
            }
            string content = s.substr(l, r-l);
            if(mp.find(content) == mp.end()){
                mp[content] = {dir + "/" + fname};
            }else{
                mp[content].push_back(dir + "/" + fname);
            }
            j++;
            i = j;
        }
    }
    vector<vector<string>> findDuplicate(vector<string>& paths) {
        unordered_map<string, vector<string>> mp;
        for(string path : paths){
            parse(path, mp);
        }
        vector<vector<string>> res;
        for(auto it : mp){
            if(it.second.size() > 1){
                res.push_back(it.second);
            }
        }
        return res;
    }
};

原文地址:https://www.cnblogs.com/zhanzq/p/11081813.html

时间: 2024-11-05 23:30:32

leetcode 609. 在系统中查找重复文件的相关文章

[LeetCode] Find Duplicate File in System 在系统中寻找重复文件

Given a list of directory info including directory path, and all the files with contents in this directory, you need to find out all the groups of duplicate files in the file system in terms of their paths. A group of duplicate files consists of at l

系统清理——查找大文件

在系统中查找大文件的方法: 1. 统计当前文件夹的文件(或文件夹)大小.并依照从大到小的顺序排序 du -s /home/* | sort -nr * -h已易读的格式显示指定文件夹或文件的大小 * -s选项指定对于文件夹不具体显示每一个子文件夹或文件的大小 2. 查找大于100M的文件.并显示具体信息 find . -type f -size +100M -exec ls -lh {} \; find的处理动作能够是: -print     默觉得输出 -ls         显示查找到的文件

Linux系统中三类重要文件的作用与区别

文章来源 | IT笔录 Linux系统中,有三种文件类型出现的非常频繁,那就是profile.bash_profile.bashrc文件. 因为名称的缘故,很多人会把这三类文件的作用记混,因此我们今天就来详细盘点一下这三类文件的作用及区别. 1. profile文件 1.1 profile文件的作用 profile(/etc/profile),用于设置系统级的环境变量和启动程序,在这个文件下配置会对所有用户生效. 当用户登录(login)时,文件会被执行,并从/etc/profile.d目录的配

在linux/unix中查找大文件

在linux/unix中查找大文件,如查找大于100M文件的位置路径,查找等于10M文件的位置路径等等,下面就介绍几个实现快速查找的命令: 1. 查找指定目录下所有大于100M的文件,命令为 find path -type f -size +100M  (path 为自己指定的目录,如当前目录./): 2. 查找指定目录下等于10M的文件,命令为 find path -type f -size 10M (path 为自己指定的目录,如当前目录./): 3. 查找指定目录下小于1M的文件,命令为

LeetCode:删除排序数组中的重复项||【80】

LeetCode:删除排序数组中的重复项||[80] 题目描述 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成. 示例 1: 给定 nums = [1,1,1,2,2,3], 函数应返回新长度 length = 5, 并且原数组的前五个元素被修改为 1, 1, 2, 2, 3 . 你不需要考虑数组中超出新长度后面的元素. 示例 2: 给定 nums =

在eclipse中查找指定文件

1.ctrl+h打开搜索界面 File Search: containing text填*,File name patterns填写hello.*,可以找到hello为命名的文件 知道文件类型,查找里面的login 2.ctrl+shift+t查找工作空间(workspace)java类文件 注意:由于是查找工作空间的,所以多的项目时找到多个类用鼠标指向去看时属于哪个项目 如下查找类文件ServiceVO,找到后会自动指向该类文件 3.ctrl+shift+r 和[Ctrl+Shift+T]对应

linux 系统中的特殊文件

特殊文件是UNIX系统中最具特色的文件特性之一.特殊文件也称设备文件.提供用户访问外部设备,而不必知道各种设备的具体操作.UNIX利用特殊文件作为用户与设备文件的接口,使用户能像访问普通文件那样访问特殊文件.      特殊文件不包含任何数据,她只是提供了一种机制,即在文件系统中建立物理设备与文件名之间的映射.特殊文件利用mknod或系统调用创建,且必须提供相关的驱动程序,并集成到系统内核中.否则即使创建了特殊文件,也无法访问相应的设备.     mknod special   type  [

(每日算法)LeetCode --- Word Search(矩阵中查找单词)

在矩阵中查找给定的单词是否出现,可以向上.向下.向左和向右查找.不能在一个字母上重复查找. Given a 2D board and a word, find if the word exists in the grid. The word can be constructed from letters of sequentially adjacent cell, where "adjacent" cells are those horizontally or vertically n

在eclipse中查找指定文件 [多种方法]

1.ctrl+h打开搜索界面 File Search: containing text填*,File name patterns填写hello.*,可以找到hello为命名的文件 知道文件类型,查找里面的login 2.ctrl+shift+t查找工作空间(workspace)java类文件 注意:由于是查找工作空间的,所以多的项目时找到多个类用鼠标指向去看时属于哪个项目 如下查找类文件ServiceVO,找到后会自动指向该类文件 3.ctrl+shift+r 和[Ctrl+Shift+T]对应