LeetCode_OJ【71】Simplify Path

Given an absolute path for a file (Unix-style), simplify it.

For example,
path = "/home/", => "/home"

path = "/a/./b/../../c/", => "/c"

这道题一开始没想好,直接进行处理,结果写出的代码又臭又长,而且是用了提交大法,错了N多次才成功的。

以下为第一次AC时的代码:


public class Solution {
    public String simplifyPath(String path) {
		StringBuilder str = new StringBuilder();
		for(int i = 0 ; i < path.length() ; ){
			if(str.length() != 0 && str.charAt(str.length() -1) == '/' && path.charAt(i) == '/')
				;
			else if(path.charAt(i) == '/'){
				int last = str.lastIndexOf("/");
				if(last != -1 && str.length() - last -1 == 2 && str.charAt(last +1) == '.' && str.charAt(last + 2) == '.'){
					if(last == 0)
						str.delete(last +1, str.length());
					else{
						str.delete(last, str.length());
						str.delete(str.lastIndexOf("/")+1, str.length());
					}
				}
				else if(last != -1 && str.length() -last -1 == 1 && str.charAt(last +1) == '.'){
					str.delete(last +1, str.length());
				}
				else
					str.append(path.charAt(i));
			}
			else
				str.append(path.charAt(i));
			i ++;
		}
		int last = str.lastIndexOf("/");
		if(last != -1 && str.length() - last -1 == 2 && str.charAt(last +1) == '.' && str.charAt(last + 2) == '.'){
			if(last == 0)
				str.delete(last +1, str.length());
			else{
				str.delete(last, str.length());
				str.delete(str.lastIndexOf("/")+1, str.length());
			}
		}
		else if(last != -1 && str.length() -last -1 == 1 && str.charAt(last +1) == '.'){
			str.delete(last +1, str.length());
		}
		if(str.length() != 1 && str.charAt(str.length() -1) == '/')
			str.delete(str.length()-1, str.length());
        return str.toString();
    }
}

反正是各种各样的规则,处理起来心累。

后来看别人的思路,其中一个做法让我豁然开朗:先将待处理的串用split函数分割,当然是以"/"分隔。

整理下思路:

两个"/"之间是"."则可以直接忽略,".."则返回上一级,其他的则直接加入路径。

要注意原串中两个或者多个"/"在一起的情况,这时split会产生""空串,还有如果在根目录,返回上一级也处理也有所不同。

下面是该思路的JAVA实现:

public class Solution {
    public String simplifyPath(String path) {
		StringBuilder res = new StringBuilder();
		res.append("/");
		String[] mid = path.split("/");
		for(int i = 0 ; i < mid.length ; i ++ ){
			if(mid[i].equals("") || mid[i].equals("."))
				continue;
			else if(mid[i].equals("..") )
				if(res.lastIndexOf("/") == 0 )
					res.delete(res.lastIndexOf("/") +1, res.length()) ;
				else
					res.delete(res.lastIndexOf("/"), res.length());
			else{
				if(res.length() == 1 && res.charAt(0) == '/' )
					res.append(mid[i]);
				else
					res.append("/").append(mid[i]);
			}	
		}
		return res.toString();
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值