Увидел эту задачу на leetcode — https://leetcode.com/problems/simplify-path/, где не так часто встречаются задачи близкие к практиктическому программированию. Ранее уже приводил решение подобной задачи для PHP. Здесь порешаем её уже на TS.
Задача упростить заданный UNIX путь, используя следующие правила:
- /.. — спуститься на уровень ниже,
- // — серия слешей должны трактоваться как один слеш,
- слеш в конце пути можно опустить,
- «.» — одиночная точка — ссылка на текущий каталог, т.е. по сути её можно опустить.
Решение
Разобьём начальный путь по символу «/», потом соберем канонический путь, следуя правилам выше.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
function simplifyPath(path: string): string { const chunks = path.split('/'); // здесь собираем части канонического пути const res: string[] = []; for (let chunk of chunks) { switch (chunk) { case '..': // нужно опуститься на уровень ниже. if (res.length > 0) res.pop(); break; case '.': case '': // многократные слеши и ссылки на текущий уровень пропускаем break; default: // накапливаем путь res.push(chunk); } } // в начале нужно добавить обязательный слеш return '/' + res.join('/'); }; |