Сложность: 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) {
$contentToFilePaths = [];
foreach ($paths as $path) {
$parts = explode(" ", $path);
$root = array_shift($parts);
foreach ($parts as $part) {
list($fileName, $content) = explode("(", $part);
$content = rtrim($content, ")");
$filePath = $root . "/" . $fileName;
if (!isset($contentToFilePaths[$content])) {
$contentToFilePaths[$content] = [];
}
$contentToFilePaths[$content][] = $filePath;
}
}
return array_values(array_filter($contentToFilePaths, function($paths) {
return count($paths) > 1;
}));
}Ставь 👍 и забирай 📚 Базу знаний
