精简Linux的文件路径:

  1. ..回退的功能
  2. .留在当前文件夹
  3. //仅仅保留一个/
  4. abc/..要返回.
  5. 报错
  6. 删除最后一个/
主要思路: 用栈记录路径的起始位置,讨论/后的不同情况就可以:
#include <iostream>
#include <map>
#include <algorithm>
#include <limits.h>
#include <assert.h>
#include <stack>
using namespace std;
int selectK(int num[], int k, int l, int r) {assert(k <= (r - l + 1) && k >= 1);int mid = (l + r) / 2, i = l, j = r;while (i <= j) {while (num[i] < num[mid]) {++i;}while (num[j] > num[mid]) {--j;}if (i <= j) {swap(num[i],num[j]);++i,--j;}}if (k == i - l)return num[i - 1];else if (k < i - l)return selectK(num, k, l, i -1);else if (k == j + 1 - l)return num[j + 1];elsereturn selectK(num, k - (j - l + 2), j + 2, r);
}
void pathcompress(char* str) {int i = 0, j = 0;char prev = '\0';stack<int> offset;offset.push(0);while(str[i]) {if (prev == '/') {if (str[i] == '.' && (str[i + 1] == '/' || str[i + 1] == '\0')) {prev = str[i + 1], i += 1;}else if (str[i] == '.' && str[i + 1] == '.' && (str[i + 2] == '/' || str[i + 2] == '\0')) {i += 2;if (offset.empty()) {cout << "error" << endl;return;            }j = offset.top();offset.pop();if (offset.empty() && str[0] == '/') {cout << "error" << endl;return;}}else if (str[i] == '/') {prev = str[i++];}else {offset.push(j);prev = str[i];str[j++] = str[i++];        }}else {prev = str[i];str[j++] = str[i++];}}if (j >=3 && str[j - 1] == '/' && str[j-2] == '/')str[j-2] = '\0';else if (j >= 2 && str[j - 1] == '/')str[j-1] = '\0';elsestr[j] = '\0';if (str[0] == '\0'){str[0] = '.';str[1] = '\0';}}int main()
{int num[] = {3,2,1,4,5};int res1 = selectK(num, 1, 0, 4);int res2 = selectK(num, 2, 0, 4);int res3 = selectK(num, 3, 0, 4);int res4 = selectK(num, 4, 0, 4);int res5 = selectK(num, 5, 0, 4);// int res6 = selectK(num, 6, 0, 4);//char str[] = "";char str[] = "/.abc/xxx./abc/bacd/.././bcd/fsgs/../../../x/y/z/../../../..";pathcompress(str);printf("%s\n",str);return 0;
}

BUT this isn't right, For example: char str[] = "../../../etc/xyz/../abc"; You couldn't print error here. The right solution is:

You must distinguish the differences with the headers ../ and dir/

#include <iostream>
#include <map>
#include <algorithm>
#include <limits.h>
#include <assert.h>
#include <stack>
using namespace std;
int selectK(int num[], int k, int l, int r) {assert(k <= (r - l + 1) && k >= 1);int mid = (l + r) / 2, i = l, j = r;while (i <= j) {while (num[i] < num[mid]) {++i;}while (num[j] > num[mid]) {--j;}if (i <= j) {swap(num[i],num[j]);++i,--j;}}if (k == i - l)return num[i - 1];else if (k < i - l)return selectK(num, k, l, i -1);else if (k == j + 1 - l)return num[j + 1];elsereturn selectK(num, k - (j - l + 2), j + 2, r);
}void pathcompress2(char* str) {stack<int> path;int i = 0, j = 0;bool isRoot = (str[0] == '/');char prev = '\0';int len = strlen(str);if (!(len >= 3 && str[0] == '.' && str[1] == '.' && str[2] == '/'))path.push(0);while(str[i]) {if (prev == '/') {if (str[i] == '.' && (str[i+1] == '/' || str[i+1] == '\0')) {prev = '/';if (str[i+1] == '\0') {str[j] = '\0';break;}i+=2;}else if (str[i] == '.' && str[i+1] == '.' && (str[i+2] == '/' || str[i+2] == '\0')) {if (path.empty()) {str[j++] = str[i];str[j++] = str[i+1];str[j++] = str[i+2];        prev = '/';if (str[i+2] == '\0') {str[j] = '\0';break;}i+=3;}else {j = path.top();path.pop();if (path.empty() && isRoot) {  //  The case : cd /..printf("Error\n");return;}if (str[i+2] == '\0') {str[j] = '\0';break;}prev = '/';i += 3;}}else if (str[i] == '/')prev = str[i++];else {prev = str[i];path.push(j);str[j++] = str[i++];} }else {prev = str[i];str[j++] = str[i++];}}if (j >= 2 && str[j - 1] == '/')str[j-1] = '\0';elsestr[j] = '\0';if (str[0] == '\0'){str[0] = '.';str[1] = '\0';}}int main()
{int num[] = {3,2,1,4,5};int res1 = selectK(num, 1, 0, 4);int res2 = selectK(num, 2, 0, 4);int res3 = selectK(num, 3, 0, 4);int res4 = selectK(num, 4, 0, 4);int res5 = selectK(num, 5, 0, 4);// int res6 = selectK(num, 6, 0, 4);char str[] = "/.abc/xxx./abc/bacd/.././bcd/fsgs/../../../x/y/z/../../../../.././././xda";//char str[] = "asdf/.abc/xxx./abc/bacd/.././bcd/fsgs/../../../x/y/z/../../../../../../.././../.././././";//char str[] = "/xyz/./bcd/fsgs/../../../x/y/z/../../../..";//char str[] = "../../../etc/xyz/../abc/.asdf/../../../../";pathcompress2(str);printf("%s\n",str);return 0;
}

The concise version is :

void pathcompress2(char* str) {stack<int> path;int i = 0, j = 0, len = strlen(str);bool isRoot = (str[0] == '/');char prev = '\0';if (!(len >= 3 && str[0] == '.' && str[1] == '.' && (str[2] == '/' || str[2] == '\0'))path.push(0);while(str[i]) {if (prev == '/') {if (str[i] == '.' && (str[i+1] == '/' || str[i+1] == '\0')) {prev = '/';if (str[i+1] == '\0') {str[j] = '\0';break;}i+=2;}else if (str[i] == '.' && str[i+1] == '.' && (str[i+2] == '/' || str[i+2] == '\0')) {if (path.empty()) {str[j++] = str[i],str[j++] = str[i+1],str[j++] = str[i+2],prev = '/';}else {j = path.top();path.pop();if (path.empty() && isRoot) {  //  The case : cd /..printf("Error\n");return;}}if (str[i+2] == '\0') {str[j] = '\0';break;}prev = '/',i += 3;}else if (str[i] == '/')prev = str[i++];else {prev = str[i],path.push(j),str[j++] = str[i++];} }else {prev = str[i],str[j++] = str[i++];}}  if (j >= 2 && str[j - 1] == '/')str[j-1] = '\0';elsestr[j] = '\0';if (str[0] == '\0'){str[0] = '.',str[1] = '\0';}
}

精简Linux文件路径相关推荐

  1. java linux 当前路径_Java,Linux文件路径

    斜杠和反斜杠 正斜杠,又称左斜杠,符号是"/": 反斜杠,也称右斜杠,符号是"\". 在Unix/Linux中,路径的分隔采用正斜"/",比 ...

  2. windows和Linux文件路径分隔符的不同及获取

    前言 在java开发的时候,往往是在windows环境下开发,遇到文件路径的问题是会用到"/"和"\",对于这两种斜杠的选择略作解释. 具体代码 反斜杠&quo ...

  3. linux 文件路径操作

    查看文件&路径 ls 查看名称 ll 查看详细信息 移动文件&路径 命令格式 运行结果 mv 文件名 文件名 将源文件名改为目标文件名 mv 文件名 目录名 将文件移动到目标目录 mv ...

  4. java linux路径_Java,Linux文件路径

    斜杠和反斜杠 正斜杠,又称左斜杠,符号是"/": 反斜杠,也称右斜杠,符号是"\". 在Unix/Linux中,路径的分隔采用正斜"/",比 ...

  5. python提取选中文件的文件名_如何从python文件路径中提取文件名?

    项目概述: 用户通过浏览器选择一个文件来导入数据.然后,我解包二进制文件.然后,我将新解包的数据保存为.csv文件,以便以后在excel中查看数据.用户当前通过键入新文件名来创建文件名.然后我继续用m ...

  6. 正则匹配文件夹及文件路径

    Win 文件路径 private static final String WIN_FILE_PATH_PATTERN = "^([a-zA-Z]:(([\\\\/])[^\\\\/:*?&l ...

  7. docker部署服务,本地文件路径正常,linux服务器文件路径找不到的小坑

    还是想每天坚持写点什么,也是菜的出奇,只能写一些很表层的东西.今天就记录一下工作中遇到docker部署到linux服务器的一个小坑. 项目中有个预览功能,要求返回给前台base64的图片,但是ftp上 ...

  8. 关于File.separator 文件路径:wind与linux下路径问题 .

    最近有个在页面上传Excel文件至服务器指定目录并进行数据校验.最后入库及进行进一步处理的应用情境,我写好代码在模拟环境下测试,完全没问题:但客户试用的时候,却老是报告"No such fi ...

  9. linux c 文件指针 句柄(FILE*) 文件描述符(fd) 文件路径(filepath) 互相转换

    最近在linux下编程常需要对一些文件进行操作.有时不同的条件下,需要将文件指针/句柄(FILE*).文件描述符(fd)以及文件路径(filepath)进行相互转换,以满足实际的编程需要. 现简单的做 ...

最新文章

  1. iOS深入探索直播推拉流实现流程(二:推流权限判断 )
  2. mysql 测试与mongodb 测试对比
  3. 读取配置文件失败_还在为Find_Package失败而烦恼吗?
  4. 匆匆那年之Java程序员之最近两周的面试总结:
  5. 【Python】time内置模块处理时间信息
  6. android 按下缩小效果松开恢复_22省份三季报:粤苏总量差距缩小,19省份实现正增长...
  7. Atitit.图片木马的原理与防范 attilax 总结
  8. Java 读写txt文件
  9. 数据结构之求二叉树叶子结点个数
  10. Linux用SSH密匙登录
  11. MCE公司:重磅!明星靶点TLR4助力攻克脑血管难题!
  12. linux+新浪行情接口,新浪天气API接口
  13. 20年广西赛题技能要求(服务器)
  14. 爬虫 【第一章】爬虫基本原理
  15. Python代码画喜羊羊怎么画_利用Python让你的命令行像蔡徐坤一样会打篮球
  16. System.Windows.Forms.DataVisualization.Charting.Chart
  17. DOS命令下硬盘坏道检测和修复工具
  18. HTTP的长连接与短连接
  19. 机械设备行业ERP系统三大功能分享
  20. 每天六点起床!真的是考研标配么?

热门文章

  1. react-props属性
  2. JavaScript算法(实例十)回文数 / 立方根 / 进制转化
  3. OpenMV(五)--STM32实现人脸识别
  4. MobSF,一款开源移动安全测试框架
  5. PTA6、输出10个不重复的英文字母 (10 分)
  6. linux发包密码,linux下网络发包工具(cp过来的)
  7. Python中判断回文数
  8. es6新特性之Map
  9. Mysql主从复制配置
  10. 调试maven源代码