Linux系统目录结构
层次:
规范路径(栈stack)
题目
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| Unix 风格的文件系统中: 一个点(.):当前目录本身 两个点(..):将目录切换到上一级(指向父目录)
1.必须始终以斜杠 / 开头,并且两个目录名之间必须只有一个斜杠 /。 2.最后一个目录名(如果存在)不能以 / 结尾。 3.必须是表示绝对路径的最短字符串。
示例 1: 输入:"/home/" 输出:"/home" 解释:注意,最后一个目录名后面没有斜杠。
示例 2: 输入:"/../" 输出:"/" 解释:从根目录向上一级是不可行的,因为根是你可以到达的最高级。
示例 3: 输入:"/home//foo/" 输出:"/home/foo" 解释:在规范路径中,多个连续斜杠需要用一个斜杠替换。
示例 4: 输入:"/a/./b/../../c/" 输出:"/c"
示例 5: 输入:"/a/../../b/../c//.//" 输出:"/c"
示例 6: 输入:"/a//bc/d//././/.." 输出:"/a/b/c"
|
分析
1.主要考察的是栈,所以定义一个辅助栈Stack
2.把字符串以"/"为分隔符分割成数组,此时数组有"路径"、""、"."、".."这四种情况;
3.遍历数组
3.1 s[i].equals("..")&&stack.isEmpty()就出栈pop();
3.2 !s[i].equals("")&&!s[i].equals(".")&&!s[i].equals(".."),即s[i]是路径就入栈;
4.如果栈空,直接返回"/"
如果栈非空,使用StringBuffer连接栈元素
代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| public class Main{ public static void main(String[] args){ Scanner input=new Scanner(System.in); String s=input.next(); //输入字符串 System.out.println(simplifyPath(s)); //调用方法返回结果 }
public static String simplifyPath(String s){ int len=s.length(); //获取字符串长度 String[] str=s.split("/"); //根据/生成字符串数组 StringBuilder sb=new StringBuilder(); //最终转字符串 Stack<String> stack=new Stack<>(); //生成stack栈
for(int i=0;i<str.length;i++){ if(str[i].equals("..")&&!stack.isEmpty()){ stack.pop(); //如果是..就返回父目录 就要出栈 }else if(!str[i].equals("")&&!str[i].equals(".")&&!str[i].equals("..")){ stack.push(str[i]); //如果是路径 /abc中的abc就要入栈 } } if(stack.isEmpty()){ return "/"; //如果最终没有目录 就要返回/ } for(int i=0;i<stack.size();i++){ sb.append("/"+stack.get(i)); //sb拼接即可 } return sb.toString(); //转字符串 }
}
|
实现结果