中国建设银行官方网站,物流公司做网站注重什么,wordpress仿微信菜单栏,网站建设作业做一个简单的网站给你一个字符串path#xff0c;表示指向某一文件或目录的Unix风格 绝对路径#xff08;以‘/’开头#xff09;#xff0c;请你将其转化为更加简洁的规范路径。 在Unix风格的文件系统中规则如下#xff1a; 一个点‘.’表示当前目录本身。此外#xff0c;两个点‘..’表示… 给你一个字符串path表示指向某一文件或目录的Unix风格 绝对路径以‘/’开头请你将其转化为更加简洁的规范路径。 在Unix风格的文件系统中规则如下 一个点‘.’表示当前目录本身。此外两个点‘..’表示将目录切换到上一级指向父目录任意多个连续的斜杠即‘//’或‘///’都被视为单个斜杠‘/’。任何其他格式的点例如‘...’或‘....’均被视为有效的文件/目录名称。 返回的简化路径必须遵循下述格式 始终以斜杠‘/’开头两个目录名之间必须只有一个斜杠‘/’。最后一个目录名如果存在不能以‘/’结尾。此外路径仅包含从根目录到目标文件或目录的路径上的目录即不含‘.’或‘..’。 返回简化后得到的规范路径。 示例1 输入path /home/输出/home解释应删除尾随斜杠。 示例2 输入path /home//foo/输出/home/foo解释多个连续的斜杠被单个斜杠替换。 示例3 输入path /home/user/Documents/../Pictures输出/home/user/Pictures解释两个点 .. 表示上一级目录父目录。 示例4 输入path /../输出/解释不可能从根目录上升一级目录。 示例5 输入path /.../a/../b/c/../d/./输出/.../b/d解释... 在这个问题中是一个合法的目录名。 提示 1 path.length 3000
path 由英文字母数字./ 或 _ 组成。
path 是一个有效的 Unix 风格绝对路径。 题解1 栈首先将给定的字符串path根据 / 分割成一个由若干字符串组成的列表记为names。根据题目中规定的【规范格式的下述格式】names中包含的字符串只能为以下几种 空字符串例如当出现多个连续的 / 就会分割出空字符串。一个点 . 两个点 ..只包含英文字母、数字或 _ 的目录名 对于【空字符串】以及【一个点】实际上无需对他们进行处理因为【空字符串】没有任何含义而【一个点】表示当前目录本身无需切换目录。 对于【两个点】或者【目录名】我们则可以用一个栈来维护路径中的每一个目录名。当我们遇到【两个点】时需要将目录切换到上一级因此只要栈不为空就弹出栈顶的目录。当遇到【目录名】时就把它放入栈。 只需要遍历names中的每个字符串并进行上述操作即可。 在所有操作完成后将栈底到栈顶的字符串用 / 进行连接再在最前面加上 / 表示根目录。 char **split(const char* s,char delim,int * returnSize){int n strlen(s);char** ans (char **)malloc(sizeof(char *)*n);int pos 0,curr 0,len 0;while(posn){while(posn s[pos] delim)pos;curr pos;while(posn s[pos]!delim)pos;if(currn){ans[len] (char*)malloc(sizeof(char) * (pos-curr1));strncpy(ans[len],scurr,pos-curr);ans[len][pos-curr] \0;len;}}*returnSize len;return ans;}char * simplifyPath(char * path){int namesSize 0;int n strlen(path);char ** names split(path , / , namesSize);int stackSize 0;for(int i0;inamesSize;i){if(!strcmp(names[i],..)){if(stackSize0) --stackSize;}else if(strcmp(names[i],.)){stack[stackSize] names[i];stackSize;}}char * ans (char *)malloc(sizeof(char) * (n 1));int curr 0;if (stackSize 0) {ans[curr] /;curr;} else {for (int i 0; i stackSize; i) {ans[curr] /;curr;strcpy(ans curr, stack[i]);curr strlen(stack[i]);}}ans[curr] \0;for (int i 0; i namesSize; i) {free(names[i]);}free(names);free(stack);return ans;} 题解2 先用strtok函数将/分割的分解每次分解判断是否为‘.’、‘..’如果为‘..’回退至上一级目录所以size自减1但若是size本身是0即在根目录是无法回退到更上一级目录的所以做一个size值的保护不让他成为负数值 如果都不满足存入stack,size,进入下一层循环 循环完后如果size 0直接返回/ 如果不是将各字符串存入res“/”隔开返回res. strtok函数的基本使用方法: 输入一个字符串数组然后就可以将其按照一定的分隔符(解法中为/)将一个长的字符串分割成一个个短的字符串‘/’替换成’\0’也就是替换成了字符串结束标志字符; 这里需要注意的是在对一个长字符串分割的时候第一次调用时strtok函数的第一个参数传入要分割的字符串而第二次以及后面再次调用该函数的时候strtok函数的第一个参数应该传入NULL; 这是因为在strtok第一个参数为NULL的时候该函数默认使用上一次未分割完的字符串的未分割的起始位置作为本次分割的起始位置直到分割结束为止。 strcmp()函数返回一个int或整数类型。 我们可以得到以下三种返回值类型。 如果两个字符串相同相等或相同则返回“ 0”; “负整数”如果第一个不匹配字符的ASCII值小于第二个字符; 如果第一个不匹配字符的ASCII值大于第二个则为“正整数” char * simplifyPath(char * path){//strtok本身会舍弃空字符串strcat来附加。char *stack[100];int size 0;for (char *s strtok(path, /); s; s strtok(NULL, /)) {if (strcmp(s, .) 0) {//do nothing} else if (strcmp(s, ..) 0) {//back size fmax(0, size-1);} else {stack[size] s;}}if (size 0) return /;char *res calloc(1000, sizeof(char));for (int i0; isize; i) {strcat(res, /);strcat(res, stack[i]);}return res;
}