题目:
以 Unix 风格给出一个文件的绝对路径,你需要简化它。或者换句话说,将其转换为规范路径。
在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (..) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。更多信息请参阅:Linux / Unix中的绝对路径 vs 相对路径
请注意,返回的规范路径必须始终以斜杠 / 开头,并且两个目录名之间必须只有一个斜杠 /。最后一个目录名(如果存在)不能以 / 结尾。此外,规范路径必须是表示绝对路径的最短字符串。
以 Unix 风格给出一个文件的绝对路径,你需要简化它。或者换句话说,将其转换为规范路径。
在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (..) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。更多信息请参阅:Linux / Unix中的绝对路径 vs 相对路径
请注意,返回的规范路径必须始终以斜杠 / 开头,并且两个目录名之间必须只有一个斜杠 /。最后一个目录名(如果存在)不能以 / 结尾。此外,规范路径必须是表示绝对路径的最短字符串。
解题思路:
我的思路跟其他人的思路差不多,首先是将原先的数据按照‘/’分割开来,然后遇到‘.’就压入一个数据,遇到’..‘就抛掉最上面的数据,如果存储数据的变量为空,则不抛。
下面是我的代码,但是本地运行没问题,上传就有问题了。。。。。。
string simplifyPath(string path) {
vector<char> vec_sub;
vector<vector<char>> vec_main;
string re = "/";
if (path.empty()){
return re;
}
for (int i = 0; i < path.size(); i++){
// 消除多个/影响
while (path[i] == '/') i++;
while (path[i] != '/'){
vec_sub.push_back(path[i]);
i++;
}
bool flag;
int DianCount=0;
for (int j = 0; j < vec_sub.size(); j++){
if (vec_sub[j] == '.'){
DianCount++;
}
}
if (DianCount > 1){
vec_main.pop_back();
}
else{
vec_main.push_back(vec_sub);
}
vec_sub.clear();
}
int n = vec_main.size();
for (int i = 0; i < n; i++){
vec_sub = vec_main[0];
vec_main.pop_back();
for (int j = 0; j < vec_sub.size(); j++){
re += vec_sub[j];
}
if (vec_main.empty()){
return re;
}
re += '/';
}
}
下面粘上一位大神的代码,大神是先将最初的字符串用stringstream + getline将原先的数据分割,之后一个个来进行处理,最终的结果是一样的。PS:见识到了getline的强大功能。
void split(string s, char delim, vector<string>& nodes) {
string temp;
stringstream ss(s);
while (getline(ss, temp, delim)) {
nodes.push_back(temp);
}
}
string simplifyPath(string path) {
vector<string> st;
vector<string> nodes;
string result;
split(path, '/', nodes);
for (auto node : nodes) {
if (node == "" || node == ".") continue;
if (node == ".." && !st.empty()) st.pop_back();
else if (node != "..") st.push_back(node);
}
for (auto it : st) result += "/" + it;
return result.empty() ? "/" : result;
}
&spm=1001.2101.3001.5002&articleId=88085268&d=1&t=3&u=1ccafb9c74694db2967a6b97b917aa43)
757

被折叠的 条评论
为什么被折叠?



