JuniorКодЧастоЕщё не отвечали
Нормализация Unix-пути (точки, .. и //)
Нормализуйте абсолютный Unix-путь: схлопните повторяющиеся слеши, отбросьте . (текущая папка) и разрешите .. (родитель) относительно предыдущего компонента. Подъём выше корня — пустая операция. Например /foo/bar/../baz// → /foo/baz.
Требования:
- Один проход со стеком компонентов.
std::string normalizePath(const std::string& path) {
// ваш код здесь
}
Допишите реализацию.
Разбейте путь по /. Кладите каждый компонент в стек; пропускайте пустые (из //) и .; на .. извлекайте из стека, если он непуст (подъём выше корня игнорируется). В конце соедините стек через / с ведущим /. Один проход, O(n) время.
- ✗Извлекать из стека на
.., когда он уже пуст (подъём выше корня) - ✗Забывать, что подряд идущие слеши дают пустые компоненты, которые надо пропустить
- ✗Посимвольные правки, неверно обрабатывающие
.., чей родитель из многих символов
- →Почему разбивать на компоненты, а не править сырую строку символов?
- →Как относительные пути (без ведущего слеша) изменят правило
..выше корня?
Оглавление
Задача
Нормализуйте абсолютный Unix-путь (., .., //) одним проходом со стеком компонентов.
Решение
#include <string>
#include <vector>
#include <sstream>
std::string normalizePath(const std::string& path) {
std::vector<std::string> stack;
std::stringstream ss(path);
std::string part;
while (std::getline(ss, part, '/')) {
if (part.empty() || part == ".") continue; // // и .
if (part == "..") { if (!stack.empty()) stack.pop_back(); } // выше корня — no-op
else stack.push_back(part);
}
std::string out;
for (const auto& c : stack) out += "/" + c;
return out.empty() ? "/" : out;
}
Ключевые моменты
- Пустые компоненты (из
//) и.просто пропускаются. ..извлекает из стека только если он непуст — подъём выше корня игнорируется.- Работа на уровне компонентов, а не символов, корректно обрабатывает многосимвольных родителей.
Оглавление