Simplify Path
2015-12-16 16:01
260 查看
题目大意:给一个Unix风格的文件的绝对路径,将其进行简化。例如:
路径 "/home/", => "/home"
路径 "/a/./b/../../c/", => "/c"
思路分析:利用栈。
代码如下:
char* simplifyPath(char* path) {
int i, t=1;
int len = strlen(path);
path[0] = '/';
for(i=1; i<len; i++) {
if(path[i]=='.' && ((i+1<len && path[i+1]=='/') || path[i+1]=='\0')) { //处理"."
i = i + 1;
} else if(path[i]=='.' && i+1<len && path[i+1]=='.' && ((i+2<len && path[i+2]=='/') || path[i+2]=='\0')) { //处理“..”
i = i + 2;
t = t - 2 < 0? 0: t-2;
while(path[t]!='/') { // 出栈,退回到上一级目录处
t--;
}
t++;
} else if(path[i]=='/') { //过滤连续的斜杠(比如“////”)的情况
continue;
} else { //其他情况则进行入栈操作
do {
path[t++] = path[i++];
} while(i<len && path[i]!='/');
path[t++] = path[i];
}
}
if(t>1) { //如果最后只剩下“/”则特殊处理一下。
path[t-1] = '\0';
} else {
path[t] = '\0';
}
return path;
}
注意事项:"..."在Unix下是合法的路径名。路径中出现连续的“///”需要将其简化为“/”。“/../../..”简化之后的路径是“/”
上面的代码略显繁琐,如果更好地处理一下代码逻辑可能会更简洁一点。
路径 "/home/", => "/home"
路径 "/a/./b/../../c/", => "/c"
思路分析:利用栈。
代码如下:
char* simplifyPath(char* path) {
int i, t=1;
int len = strlen(path);
path[0] = '/';
for(i=1; i<len; i++) {
if(path[i]=='.' && ((i+1<len && path[i+1]=='/') || path[i+1]=='\0')) { //处理"."
i = i + 1;
} else if(path[i]=='.' && i+1<len && path[i+1]=='.' && ((i+2<len && path[i+2]=='/') || path[i+2]=='\0')) { //处理“..”
i = i + 2;
t = t - 2 < 0? 0: t-2;
while(path[t]!='/') { // 出栈,退回到上一级目录处
t--;
}
t++;
} else if(path[i]=='/') { //过滤连续的斜杠(比如“////”)的情况
continue;
} else { //其他情况则进行入栈操作
do {
path[t++] = path[i++];
} while(i<len && path[i]!='/');
path[t++] = path[i];
}
}
if(t>1) { //如果最后只剩下“/”则特殊处理一下。
path[t-1] = '\0';
} else {
path[t] = '\0';
}
return path;
}
注意事项:"..."在Unix下是合法的路径名。路径中出现连续的“///”需要将其简化为“/”。“/../../..”简化之后的路径是“/”
上面的代码略显繁琐,如果更好地处理一下代码逻辑可能会更简洁一点。
相关文章推荐
- Linux C函数参考手册(PDF版)
- Lua教程(十七):C API简介
- C#实现打造气泡屏幕保护效果
- 使用C#代码获取存储过程返回值
- C/C++数据对齐详细解析
- 利用C语言来求最大连续子序列乘积的方法
- 字符串的组合算法问题的C语言实现攻略
- C 语言基础教程(我的C之旅开始了)[三]
- C++中的extern “C”用法详解
- C 语言基础教程(我的C之旅开始了)[七]
- 最大子矩阵问题实例解析
- C字符串操作函数实现方法小结
- C语言中static的作用及C语言中使用静态函数有何好处
- 字典树的基本知识及使用C语言的相关实现
- 详解C语言中free()函数与getpagesize()函数的使用
- C/C++ 宏详细解析
- 使用C语言解决字符串全排列问题
- C#定制Excel界面并实现与数据库交互的方法
- C#使用ImitateLogin模拟登录百度