笔试题——Unix路径简化

来源:互联网 发布:腾讯视频 for mac官方 编辑:程序博客网 时间:2024/05/29 07:04

简化Unix风格的路径,需要考虑的包括“/../”,“//”,“/./”等情况


输入描述:

一个字符串,表示Unix风格的路径

输出描述:

简化后的Unix风格的路径


示例1:

输入:"/home/"

输出:"/home"


示例2:

输入:"/a/./b/../../c/"

输出:"/c"


分析:

“..”表示返回路径的上级目录(如果当前是根目录则不处理),“.”表示当前目录。

使用栈来记录路径名。在处理字符串路径的过程中,遵循以下条件:

(1)重复连续的“/”,只需处理一个即可,即跳过重复连续出现的多个“/”;

(2)如果路径名不为“.”或“..”,将记录的字符串入栈;

(3)如果路径名是“..”且栈不为空,则需要出栈,否则无需处理。

在遍历完字符串之后,逐个取出栈中元素,用“/”分隔并拼接起来,注意:取出的元素是从后往前进行拼接的。


代码如下:

import java.util.Scanner;import java.util.Stack;public class SimplePath {public static void main(String[] args) {Scanner in = new Scanner(System.in);String path = in.nextLine();String simplePath = "";Stack<String> stack = new Stack<String>();for(int i=0;i<path.length();i++){String name="";while(i<path.length() && path.charAt(i)=='/')i++;//该操作跳过斜线'/'while(i<path.length() && path.charAt(i)!='/')name += path.charAt(i++);//记录路径名,也包括'.'和'。。'if(!name.equals(".") && !name.equals("..")){stack.push(name);}if(!stack.isEmpty() && name.equals(".."))stack.pop();//如果当前文件名为“..”,表示退到上一层目录,需弹出栈}if(stack.isEmpty())System.out.print("/");while(!stack.isEmpty()){simplePath = "/"+stack.peek()+simplePath;stack.pop();}System.out.println(simplePath);}}






原创粉丝点击