Сложность: hard
Спроектируйте структуру данных, которая симулирует файловую систему в памяти.
Реализуйте класс FileSystem:
FileSystem() Инициализирует объект системы.
List<String> ls(String path)
Если path является путем к файлу, возвращает список, содержащий только имя этого файла.
Если path является путем к директории, возвращает список имен файлов и директорий в этой директории.
Ответ должен быть в лексикографическом порядке.
void mkdir(String path) Создает новую директорию согласно заданному пути. Заданная директория не существует. Если промежуточные директории в пути не существуют, вы также должны создать их.
void addContentToFile(String filePath, String content)
Если filePath не существует, создает файл, содержащий заданный контент.
Если filePath уже существует, добавляет заданный контент к исходному содержимому.
String readContentFromFile(String filePath) Возвращает содержимое файла по пути filePath.
Пример:
Input
["FileSystem", "ls", "mkdir", "addContentToFile", "ls", "readContentFromFile"]
[[], ["/"], ["/a/b/c"], ["/a/b/c/d", "hello"], ["/"], ["/a/b/c/d"]]
Output
[null, [], null, null, ["a"], "hello"]
Explanation
FileSystem fileSystem = new FileSystem();
fileSystem.ls("/"); // return []
fileSystem.mkdir("/a/b/c");
fileSystem.addContentToFile("/a/b/c/d", "hello");
fileSystem.ls("/"); // return ["a"]
fileSystem.readContentFromFile("/a/b/c/d"); // return "hello"
👨💻 Алгоритм:
1⃣Инициализация файловой системы:
Создайте класс FileSystem, который будет содержать вложенный класс File. Класс File будет представлять либо файл, либо директорию, содержать флаг isfile, словарь files и строку content.
2⃣Обработка команд:
Реализуйте метод ls, который возвращает список файлов и директорий в указанном пути, либо имя файла, если указанный путь является файлом.
Реализуйте метод mkdir, который создаёт директории по указанному пути. Если промежуточные директории не существуют, создайте их.
Реализуйте метод addContentToFile, который добавляет содержимое в файл по указанному пути. Если файл не существует, создайте его.
Реализуйте метод readContentFromFile, который возвращает содержимое файла по указанному пути.
3⃣Обработка путей и работа с файлами/директориями:
Используйте метод split для разделения пути на составляющие и навигации по дереву директорий и файлов.
Для каждой команды выполняйте соответствующие операции по созданию, чтению или записи содержимого файлов и директорий.
😎 Решение:
class File {
public $isFile = false;
public $files = [];
public $content = "";
}
class FileSystem {
private $root;
public function __construct() {
$this->root = new File();
}
private function navigate($path) {
$t = $this->root;
if ($path !== "/") {
$dirs = explode("/", $path);
foreach ($dirs as $dir) {
if (!empty($dir)) {
if (!isset($t->files[$dir])) {
$t->files[$dir] = new File();
}
$t = $t->files[$dir];
}
}
}
return $t;
}
public function ls($path) {
$t = $this->navigate($path);
if ($t->isFile) return [basename($path)];
$res = array_keys($t->files);
sort($res);
return $res;
}
public function mkdir($path) {
$this->navigate($path);
}
public function addContentToFile($filePath, $content) {
$t = $this->navigate($filePath);
$t->isFile = true;
$t->content .= $content;
}
public function readContentFromFile($filePath) {
return $this->navigate($filePath)->content;
}
}Ставь 👍 и забирай 📚 Базу знаний
