精简Linux的文件路径:
- ..回退的功能
- .留在当前文件夹
- //仅仅保留一个/
- abc/..要返回.
- 报错
- 删除最后一个/
主要思路: 用栈记录路径的起始位置,讨论/后的不同情况就可以:
#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]; else return selectK(num, k - (j - l + 2), j + 2, r); } void pathcompress(char* str) { int i = 0, j = 0; char prev = '