题目:Simplify Path
简化路径。
1.回到父目录时要合并,去掉父目录。
2.去掉多余的'/'
3.去掉最后的一个'/'
4.去掉多余的'.'
5."/."和"/.."这两种情况也要特殊考虑。
package com.example.medium; public class SimplifyPath { //判断当前遇到的'/'是否表示返回父目录,即"../"(开头)或"/../" private boolean checkBackUp(String path,int i){ if(i < 2)return false; if(path.charAt(i - 1) == '.' && path.charAt(i - 2) == '.'){ if(i == 2)return true; if(path.charAt(i - 3) == '/')return true; } return false; } //判断当前遇到的'/'是否表示当前目录,即"./"(开头)或"/./"冗余的"./" private boolean checkCurrentDir(String path,int i){ if(i < 1)return false; if(path.charAt(i - 1) == '.'){ if(i == 1)return true; if(path.charAt(i - 2) == '/')return true;//防止文件名中含有"."的情况 } return false; } public String simplifyPath(String path) { char pathArray[] = new char[path.length()]; int index = 0; char ch; for(int i = 0;i < path.length();i++){ ch = path.charAt(i); if(ch == '/'){ if(i > 0 && path.charAt(i - 1) == '/')continue;//冗余'/' if(checkCurrentDir(path, i)){//是冗余的当前目录"./" index = index - 1;//坐标向后移动,覆盖掉已复制的"." continue; } if(checkBackUp(path, i)){//是返回父目录 index -= 4;//坐标回退4 index = index < 0 ? 0 : index;//小于零的情况 while(index > 0 && pathArray[index] != '/')index--;//去掉当前文件名 if(pathArray[index] == '/')index++;//退回到父目录 continue; } } pathArray[index++] = ch; } if(pathArray[index - 1] == '.'){//"/."或"/.."的特殊情况 int lastNotNum = index - 1; while(lastNotNum > 0 && pathArray[lastNotNum] == '.')lastNotNum--; if(pathArray[lastNotNum] == '/' && index - lastNotNum < 4){ if(index - lastNotNum == 3){//"/.."的特殊情况 if(lastNotNum > 0)lastNotNum--; while(lastNotNum > 0 && pathArray[lastNotNum] != '/')lastNotNum--; } index = lastNotNum + 1; } } //去掉最后的"/",如果存在 if(index > 0 && pathArray[index - 1] == '/')pathArray[--index] = 0; if(pathArray[0] != '/')return new StringBuilder("/").append(pathArray,0,index).toString(); return new StringBuilder().append(pathArray,0,index).toString(); } public static void main(String args[]){ long startTime = System.currentTimeMillis(); System.out.println(new SimplifyPath().simplifyPath(new String("/."))); long endTime = System.currentTimeMillis(); System.out.println("程序运行时间:"+(endTime-startTime) + "ms"); } }