手癢解個(gè)iOS面試題..

題目來源請(qǐng)點(diǎn)此處

寫一個(gè)方法,請(qǐng)將任意字符串中的"<" ">"最近的之間的內(nèi)容刪除,并返回其余的字符串;例如:
NSString * str1 = @"<hdadsdtmlsssss></dqdqw>4<5<//dwdq><uioq>";
返回 4 <5;
NSString *str2 = @"<dwqdwqdq>abc<dwdwdw>de<dddd>";
返回 abcde;

半夜被雨吵醒..逛下簡書發(fā)現(xiàn)達(dá)文哥解答了一道iOS面試題, 好久沒寫算法了..手癢果斷來了一發(fā)..這一擼竟然就沒了1個(gè)多小時(shí)..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) {
            // 是否應(yīng)該緩存
            bool shouldBuffer = false;
            // 緩存開始的Index
            int startIndexOfBuffer = -1;
            // 上次遇到左括號(hào)的Index
            int lastLeftBracketIndex = 0;
            for (int k = 0; k < text.length; k++) {
                unichar _char = [text characterAtIndex:k];
                // 若遇到左括號(hào)就一直緩存字符, 直至遇到右括號(hào)才停止緩存
                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) {
                    // 遇到右括號(hào)果斷關(guān)閉緩存, 可以直接寫入了, 等再次遇到左括號(hào)才開啟緩存
                    shouldBuffer = false;
                }
                
                if (shouldBuffer) {// 記錄緩存
                    buffer[j++] = _char;
                }
                else if (!buffer) {// 不緩存則直接追加
                    finalText[i++] = _char;
                }
                else if(buffer) {// 追加緩存
                    //validCount就是要取出來的緩存字符個(gè)數(shù), 剩下的字符拋棄(從最后一個(gè)左括號(hào)到右括號(hào)前的過濾字符)
                    int validCount = lastLeftBracketIndex-startIndexOfBuffer;
                    for (int m = 0; m < validCount; m++) {
                        finalText[i++] = buffer[m];// 丫的..這里手賤寫了個(gè)m++, 找錯(cuò)花了好一會(huì)!!!差點(diǎn)懷疑人生, 掛不得輸出結(jié)果老是少1個(gè)字符
                    }
                    // 重置緩存起點(diǎn)!
                    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 @"";
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容