美文网首页
答复一下《今天的iOS面试上机题》

答复一下《今天的iOS面试上机题》

作者: 子达如何 | 来源:发表于2016-03-20 17:28 被阅读812次

今天看到个面试题目, 觉得还有点意思。
原题目在这里(由于答复里面不支持Macdown,只好另开个文章来答复了)

最初的时候以为一个正则替换"<.*?>"应该就能解决问题,但是题目要求的<>之间的最短距离,并不是正则表达式中的最短匹配的概念,比如<a<b<c<!!!>在正则里面是符合"<.*?>"的,但是不符合题意,题意要求匹配<!!!>。又想了一下反向匹配如何?然后反向匹配又会遇到<!!!>a>b>c>的两难情况。

还望正则高手指点一下。有没有可能用正则匹配?

无奈只好自己写复杂的算法:

- (NSString *)myTrimString:(NSString *)from {
    static NSString *startFlag = @"<";
    static NSString *endFlag = @">";
    
    NSMutableString *result = [from mutableCopy];
    // find the start flag
    NSRange startRange = [result rangeOfString:startFlag];
    while (startRange.location != NSNotFound) {
        CGFloat remainIndex = startRange.location + startRange.length;
        NSRange remainRange = NSMakeRange(remainIndex, result.length-remainIndex);
        // search from the remaining text
        NSRange endRange = [result rangeOfString:endFlag options:0 range:remainRange];
        if (endRange.location != NSNotFound) {
            // try to locate the last one <, because we want to find the shortest content
            CGFloat endIndex = endRange.location + endRange.length;
            NSRange matchedRange = NSMakeRange(startRange.location, endIndex - startRange.location);
            // use the NSBackwardsSearch option, so we find the first flag is the last flag we want.
            NSRange nearestRange = [result rangeOfString:startFlag options:NSBackwardsSearch range:matchedRange];
            matchedRange = NSMakeRange(nearestRange.location, endIndex - nearestRange.location);
            [result deleteCharactersInRange:matchedRange];
            // because we have delete the matched content in result,
            // so the remain index must depent on this fact.
            remainIndex = matchedRange.location;// + matchedRange.length - matchedRange.length;
            startRange = [result rangeOfString:startFlag options:0 range:NSMakeRange(remainIndex, result.length - remainIndex)];
        }
        else {
            // ok, have a rest:)
            break;
        }
    }
    return result;
}

顺便提升一下原题目的测试用例:

@"<a>3<4<5</b>5>4>3<//c><d>eee";

无奖欢迎抓BUG~~


BTW: 有空用Functional的思想再实现一下看看将会是怎么样的感觉。

相关文章

网友评论

      本文标题:答复一下《今天的iOS面试上机题》

      本文链接:https://www.haomeiwen.com/subject/hjqklttx.html