100天iOS数据结构与算法实战 Day06 – 栈的算法实战 Simplify Path

题目描述

给一个Unix风格的绝对路径,简化他。注意的是绝对路径以/开始(root 目录),( . )代表当前的目录,( .. )代表父目录。

例如:

 
  1. "/a/./"   --> 表示停留在当前 'a'

  2. "/a/b/.." --> 表示跳转到父目录,from 'b' to 'a'

  3. "////"    --> 连续多个 '/' 是有效的路径,等于单个'/'

  4.  

  5. Input : /home/

  6. Output : /home

  7.  

  8. Input : /a/./b/../../c/

  9. Output : /c

  10.  

  11. Input : /a/..

  12. Output : /

  13.  

  14. Input : /a/../

  15. Ouput : /

  16.  

  17. Input : /../../../../../a

  18. Ouput : /a

  19.  

  20. Input : /a/./b/./c/./d/

  21. Ouput : /a/b/c/d

  22.  

  23. Input : /a/../.././../../.

  24. Ouput : /

  25.  

  26. Input : /a//b//c//////d

  27. Ouput : /a/b/c/d

注意:大家可以在自己的终端试试,就很容易理解这道题意了。

灵感示意图

第一步 先把字符串拆分成数组根据( / )

100天iOS数据结构与算法实战 Day06 – 栈的算法实战 Simplify Path

第二步 把目录元素入栈

100天iOS数据结构与算法实战 Day06 – 栈的算法实战 Simplify Path

第三步 把原始栈reverse,最后把reverse的栈元素一一出栈并拼接

100天iOS数据结构与算法实战 Day06 – 栈的算法实战 Simplify Path

主要代码

 
  1. - (NSString *)simplifyPath100天iOS数据结构与算法实战 Day06 – 栈的算法实战 Simplify PathNSString *)inputStr

  2. {

  3.  

  4.    NSMutableString *dirStr = [@"" mutableCopy];

  5.    //1

  6.    [dirStr appendString:@"/"];

  7.     //2

  8.    NSMutableArray *dirArray = [[inputStr componentsSeparatedByString:@"/"] mutableCopy];

  9. //3

  10.    DSStack *newStack = [[DSStack alloc] initWithSize:20];

  11.  

  12.    for (int i = 0 ; i < dirArray.count; i++)

  13.    {

  14.     //4

  15.        while ([dirArray[i] isEqualToString:@""])

  16.        {

  17.            i++;

  18.        }

  19.         //5

  20.        while (i < dirArray.count && ![dirArray[i] isEqualToString:@""])

  21.        {

  22.            if ([dirArray[i] isEqualToString:@"."])

  23.            {

  24.  

  25.            }

  26.            else if ([dirArray[i] isEqualToString:@".."])

  27.            {

  28.                if (![newStack isEmpty]) {

  29.                    [newStack popLastObject];

  30.                }

  31.            }

  32.            else

  33.            {

  34.                [newStack push:dirArray[i]];

  35.  

  36.            }

  37.            i++;

  38.        }

  39.    }

  40.     //6

  41.    DSStack *newStack1 = [[DSStack alloc] initWithSize:20];

  42.    while (![newStack isEmpty])

  43.    {

  44.        [newStack1 push:[newStack popLastObject]];

  45.    }

  46.     //7

  47.    while (![newStack1 isEmpty])

  48.    {

  49.        if ([newStack1 sizeOfStack]!= 1)

  50.            {

  51.                [dirStr appendFormat:@"%@/",[newStack1 popLastObject]];

  52.            }

  53.        else

  54.  

  55.        {

  56.            [dirStr appendFormat:@"%@",[newStack1 popLastObject]];

  57.  

  58.        }

  59.    }

  60.  

  61.    return dirStr;

  62. }

思路描述

  1. 根路径是必须有一个( / )

  2. 根据( / )拆分字符串,目的为了后面把多个( / )变成单个( / )

  3. 创建一个栈结构

  4. 循环遍历数组如果元素是空字符串,index向后移动

  5. 把非空的元素目录比如a,b入栈。当碰到( . )不做操作,如果遇到( .. )如果栈不为空则出栈

  6. 创建一个辅助栈,reverse刚开始的那个栈,便于拼接字符串

  7. 拼接栈内的元素,但第一个不需要后缀( / )

 

 

  交流群昵称:ios-Swift/Object C开发上架
交流群号: 869685378   找ios马甲包开发者合作,有兴趣请添加Q 51259559

 

  • 100天iOS数据结构与算法实战 Day01

  • 100天iOS数据结构与算法实战 Day02 – 栈

  • 100天iOS数据结构与算法实战 Day03 – 栈的算法实战 Valid Parentheses

  • 100天iOS数据结构与算法实战 Day04 – 栈的算法实战 逆波兰表示法

  • 100天iOS数据结构与算法实战 Day05 – 栈的算法实战 Evaluate Reverse Polish Nota