寫一個(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 @"";
}