add: 230412

This commit is contained in:
Eatswap 2023-04-12 18:24:50 +08:00
parent 61cd797e28
commit 5c584f805c
Signed by: Eatswap
GPG Key ID: BE661106A1F3FA0B
2 changed files with 45 additions and 1 deletions

44
cpp/2304/230412.cpp Normal file
View File

@ -0,0 +1,44 @@
#include <string>
/**
* 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;
}

View File

@ -4,4 +4,4 @@ PROJECT(2304)
SET(CMAKE_CXX_STANDARD 23) SET(CMAKE_CXX_STANDARD 23)
SET(CMAKE_EXPORT_COMPILE_COMMANDS true) SET(CMAKE_EXPORT_COMPILE_COMMANDS true)
ADD_EXECUTABLE(2304 230411-CN.cpp) ADD_EXECUTABLE(2304 230412.cpp)