19.9.26 简化路径 中等(需改进)
? ? ? 题目:
? 代码: 1 class Solution { 2 private Stack<String> st; 3 public String simplifyPath(String path) { 4 char[] save = path.toCharArray(); //将字符串拆分成数组 5 char[] result = new char[save.length]; //存储排列好的字符数组 6 7 if(save.length == 1) //当长度为1时,必为 / ,即可直接返回 8 return path; 9 int j = 0; //结果数组的下标 10 for(int i = 0; i < save.length; i++){ //循环拆分数组 11 if(i != 0 && save[i - 1] == ‘/‘ && save[i] == ‘/‘){ //除了第一位,其他位的多个斜杠不录入 12 if(j != 1 && result[j - 1] == ‘/‘){ //有时候删除点‘.‘后会遇到之前存起来的‘/‘,但除去第一位的‘/‘ 13 if(i == save.length - 1){ //如果已经计算到最后一位,结果数组下标-1(因为每次添加完后都会让j+1指向下一个空) 14 j--; 15 } 16 continue; //多个斜杠,就继续循环不录入 17 } 18 } 19 20 if(j > 0 && result[j - 1] == ‘/‘ && save[i] == ‘/‘){ //除去第一位,遇到上一个已经录入的斜杠,如果这一位也是斜杠,不录入斜杠 21 if(i == save.length - 1){ 22 j--; 23 } 24 continue; 25 } 26 27 if(i == save.length - 1 && save[i] == ‘/‘){ //最后一位是‘/‘就退出循环,不录入 28 j--; 29 break; 30 } 31 32 if(i < save.length - 2 && save[i] == ‘.‘ && save[i + 1] == ‘.‘ && save[i + 2] == ‘.‘){ //确定是两个点‘.‘以上,存起来 33 int n = 0; 34 int m = i; 35 while(m < save.length && save[m] == ‘.‘){ 36 n++; 37 m++; 38 } 39 40 for(int index = 1; index <= n; i++,index++){ 41 result[j++] = save[i]; 42 } 43 i--; 44 if(i == save.length - 1) --j; 45 continue; 46 } 47 48 if(i < save.length - 1 && save[i] == ‘.‘ && save[i + 1] == ‘/‘ && save[i - 1] != ‘.‘){ //确定是一个点‘.‘后,删除前一位已存储的‘/‘,不录入 49 continue; 50 } 51 52 if(save[i] == ‘.‘ && save[i - 1] == ‘.‘ && save[i - 2] != ‘.‘){ //确定是两个点‘.‘后,删除前两位已存储的‘/‘和目录,不录入 53 if(i < save.length- 1 && save[i + 1] == ‘/‘ || i == save.length - 1){ 54 55 if(j > 1){ 56 --j; 57 while(result[j - 1] != ‘/‘ && j > 1){ 58 --j; 59 } 60 } 61 } 62 else result[j++] = save[i]; 63 if(i == save.length - 1) --j; 64 65 continue; 66 } 67 68 if(i < save.length - 1 && save[i] == ‘.‘ && save[i + 1] == ‘.‘){ //确定是两个‘.‘后,对第一个‘.‘不录入 69 if(i < save.length - 2 && save[i + 2] != ‘/‘){ 70 result[j++] = save[i]; 71 continue; 72 } 73 continue; 74 } 75 76 if(i == save.length - 1 && save[i] ==‘.‘){ 77 78 --j; 79 80 break; 81 } 82 83 result[j++] = save[i]; 84 85 86 if(i == save.length - 1) --j; 87 88 } 89 90 if(j > 1 && result[j] == ‘/‘) --j; 91 92 char[] result1 = new char[j + 1]; 93 for(int i = 0; i <= j; i++){ 94 result1[i] = result[i]; 95 } 96 String resultCurr = new String(result1); 97 return resultCurr; 98 } 99 } ? 心得: 1、一开始想的时候,是想着这样暴力解法的,想了大概的几种情况,就开始调试,然后边调试边改,完全忘了这是一个关于栈的题目,所以代码也特别混乱; 2、本来觉得这道题怎么这样子,就一直在找漏洞,都没有知识点,最后做完看题解才明白有很简单的做法; 3、就是把字符串用正则或者split的方法拆分成字符串数组,然后压入栈中,可以说 ‘/‘ 是完全没用的,重要的是 ‘.‘ 和字母字符串,最后拆分好再添加 ‘/‘就好了。 4、以后思考题目不要再太容易陷入暴力解法了,学会一下转弯。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |