From 5c584f805c889d6db402f5796cfd4ef1f5b909bf Mon Sep 17 00:00:00 2001 From: Eatswap Date: Wed, 12 Apr 2023 18:24:50 +0800 Subject: [PATCH] add: 230412 --- cpp/2304/230412.cpp | 44 +++++++++++++++++++++++++++++++++++++++++ cpp/2304/CMakeLists.txt | 2 +- 2 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 cpp/2304/230412.cpp diff --git a/cpp/2304/230412.cpp b/cpp/2304/230412.cpp new file mode 100644 index 0000000..21ea80c --- /dev/null +++ b/cpp/2304/230412.cpp @@ -0,0 +1,44 @@ +#include + +/** + * 71. Simplify Path + * Given a string path, which is an absolute path (starting with a slash '/') to a file or directory in a Unix-style file system, convert it to the simplified canonical path. + * + * In a Unix-style file system, a period '.' refers to the current directory, a double period '..' refers to the directory up a level, and any multiple consecutive slashes (i.e. '//') are treated as a single slash '/'. For this problem, any other format of periods such as '...' are treated as file/directory names. + * + * The canonical path should have the following format: + * + * The path starts with a single slash '/'. + * Any two directories are separated by a single slash '/'. + * The path does not end with a trailing '/'. + * The path only contains the directories on the path from the root directory to the target file or directory (i.e., no period '.' or double period '..') + * Return the simplified canonical path. + */ + +class Solution { +public: + static std::string simplifyPath(const std::string&); +}; + +std::string Solution::simplifyPath(const std::string& path) { + char buf[3072]{}; + int n = path.size(), ps = 0, pt = 1, prev = 0; + const char* ptr = path.c_str(); + for (; pt <= n; ++pt) { + if (ptr[pt] && ptr[pt] != '/') + continue; + if (int diff = pt - prev; diff == 3 && ptr[pt - 1] == '.' && ptr[pt - 2] == '.') { + while (ps > 0 && buf[--ps] != '/'); + } else if (diff > 2 || (diff == 2 && ptr[prev + 1] != '.')) { + buf[ps++] = '/'; + for (int i = prev + 1; i < pt; buf[ps++] = ptr[i++]); + } + prev = pt; + } + return ps ? std::string(buf, buf + ps) : "/"; +} + +int main() { + auto r = Solution::simplifyPath("/a//b////c/d//././/.."); + return 0; +} diff --git a/cpp/2304/CMakeLists.txt b/cpp/2304/CMakeLists.txt index 3e3d796..d1acbc6 100644 --- a/cpp/2304/CMakeLists.txt +++ b/cpp/2304/CMakeLists.txt @@ -4,4 +4,4 @@ PROJECT(2304) SET(CMAKE_CXX_STANDARD 23) SET(CMAKE_EXPORT_COMPILE_COMMANDS true) -ADD_EXECUTABLE(2304 230411-CN.cpp) +ADD_EXECUTABLE(2304 230412.cpp)