Сложность: medium
Получив список 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, это означает, что каталог является только корневым. На выходе получается список групп дублирующихся путей к файлам. Для каждой группы он содержит все пути к файлам, которые имеют одинаковое содержимое. Путь к файлу - это строка, имеющая следующий формат: "каталог_путь/имя_файла.txt".
Пример:
Input: paths = ["root/a 1.txt(abcd) 2.txt(efgh)","root/c 3.txt(abcd)","root/c/d 4.txt(efgh)","root 4.txt(efgh)"]
Output: [["root/a/2.txt","root/c/d/4.txt","root/4.txt"],["root/a/1.txt","root/c/3.txt"]]
👨💻 Алгоритм:
1⃣Пройдите по списку путей, разберите каждый путь и соберите информацию о содержимом файлов и соответствующих им путях.
2⃣Используйте словарь для хранения списков путей файлов, сгруппированных по их содержимому.
3⃣Пройдите по словарю и соберите группы дубликатов, содержащие как минимум два пути.
😎 Решение:
function findDuplicate(paths) {
const contentToFilePaths = {};
for (const path of paths) {
const parts = path.split(" ");
const root = parts[0];
for (let i = 1; i < parts.length; i++) {
const [fileName, content] = parts[i].split("(");
const filePath = `${root}/${fileName}`;
const contentKey = content.slice(0, -1);
if (!contentToFilePaths[contentKey]) {
contentToFilePaths[contentKey] = [];
}
contentToFilePaths[contentKey].push(filePath);
}
}
return Object.values(contentToFilePaths).filter(paths => paths.length > 1);
}Ставь 👍 и забирай 📚 Базу знаний
