"最近的之间的内容删除,并返回其余的字符串;例如:NS...">

手痒解个iOS面试题..

作者: ShawnFoo | 来源:发表于2016-03-21 03:57 被阅读787次

题目来源请点此处

写一个方法,请将任意字符串中的"<" ">"最近的之间的内容删除,并返回其余的字符串;例如:
NSString * str1 = @"<hdadsdtmlsssss></dqdqw>4<5<//dwdq><uioq>";
返回 4 <5;
NSString *str2 = @"<dwqdwqdq>abc<dwdwdw>de<dddd>";
返回 abcde;

半夜被雨吵醒..逛下简书发现达文哥解答了一道iOS面试题, 好久没写算法了..手痒果断来了一发..这一撸竟然就没了1个多小时..T-T..丫的, 睡觉去了..

- (NSString *)filterText:(NSString *)text {
    
    static const unichar leftBracket = '<';
    static const unichar rightBracket = '>';
    
    if (text.length > 0) {
        
        unichar *finalText = (unichar *)malloc(sizeof(unichar)*text.length);
        int i = 0;
        unichar *buffer = NULL;
        int j = 0;
        if (finalText) {
            // 是否应该缓存
            bool shouldBuffer = false;
            // 缓存开始的Index
            int startIndexOfBuffer = -1;
            // 上次遇到左括号的Index
            int lastLeftBracketIndex = 0;
            for (int k = 0; k < text.length; k++) {
                unichar _char = [text characterAtIndex:k];
                // 若遇到左括号就一直缓存字符, 直至遇到右括号才停止缓存
                if (_char == leftBracket) {
                    shouldBuffer = true;
                    if (startIndexOfBuffer < 0) {
                        startIndexOfBuffer = k;
                    }
                    lastLeftBracketIndex = k;
                    if (!buffer) {
                        buffer = (unichar *)malloc(sizeof(unichar)*(text.length-i));
                        j = 0;
                        if (!buffer) {
                            NSLog(@"开辟空间失败:[");
                            return nil;
                        }
                    }
                }
                else if (_char == rightBracket) {
                    // 遇到右括号果断关闭缓存, 可以直接写入了, 等再次遇到左括号才开启缓存
                    shouldBuffer = false;
                }
                
                if (shouldBuffer) {// 记录缓存
                    buffer[j++] = _char;
                }
                else if (!buffer) {// 不缓存则直接追加
                    finalText[i++] = _char;
                }
                else if(buffer) {// 追加缓存
                    //validCount就是要取出来的缓存字符个数, 剩下的字符抛弃(从最后一个左括号到右括号前的过滤字符)
                    int validCount = lastLeftBracketIndex-startIndexOfBuffer;
                    for (int m = 0; m < validCount; m++) {
                        finalText[i++] = buffer[m];// 丫的..这里手贱写了个m++, 找错花了好一会!!!差点怀疑人生, 挂不得输出结果老是少1个字符
                    }
                    // 重置缓存起点!
                    startIndexOfBuffer = -1;
                    free(buffer);
                    buffer = NULL;
                }
            }
        }
        else {
            NSLog(@"开辟空间失败:[");
            return nil;
        }
        NSString *fText = nil;
        // Raises an exception if characters is NULL, even if length is 0.
        if (i > 0) {
            fText = [[NSString alloc] initWithCharacters:finalText length:i];
        }
        free(finalText);
        finalText = NULL;
        
        return fText ?: @"";
    }
    return @"";
}

相关文章

  • 手痒解个iOS面试题..

    题目来源请点此处 写一个方法,请将任意字符串中的"<" ">"最近的之间的内容删除,并返回其余的字符串;例如:NS...

  • iOS最新面试题汇总(四)

    iOS最新面试题汇总:iOS最新面试题汇总(一)iOS最新面试题汇总(二)iOS最新面试题汇总(三)iOS最新面试...

  • iOS最新面试题汇总(三)

    iOS最新面试题汇总:iOS最新面试题汇总(一)iOS最新面试题汇总(二)iOS最新面试题汇总(三)iOS最新面试...

  • iOS最新面试题汇总(一)

    iOS最新面试题汇总:iOS最新面试题汇总(一)iOS最新面试题汇总(二)iOS最新面试题汇总(三)iOS最新面试...

  • iOS最新面试题汇总(二)

    iOS最新面试题汇总:iOS最新面试题汇总(一)iOS最新面试题汇总(二)iOS最新面试题汇总(三)iOS最新面试...

  • iOS面试题

    iOS面试题 iOS面试题

  • 2019-06-06

    iOS高级面试题 如何面试iOS工程师 一个渣硕iOS春招总结 请你出一套iOS面试题 压倒程序员的最后一个面试题...

  • iOS 面试题及答案

    面试题集锦 iOS面试题及答案1iOS面试题及答案2iOS进阶面试题及答案3 一. CoreAnimation 相...

  • iOS面试题分享——附BAT常见的iOS面试题

    iOS面试题分享——附BAT常见的iOS面试题

  • IOS面试(2018)

    经典面试题 非技术面试题 C面试题1 C面试题2 C面试题3 iOS笔试题01 iOS笔试题02 iOS笔试题03...

网友评论

  • 子达如何:不对,空间消耗上多了一个缓冲的buffer,相当于用空间换了再次搜索的时间
  • 子达如何:嗯,不错思路是顺着记下需要的字符,空间消耗差不多,搜索上减少了一次回头搜索的处理

本文标题:手痒解个iOS面试题..

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