NSMutableString *string = [NSMutableString stringWithFormat:@"aabbssddffiieeoo"];
for (NSInteger i = 0; i <= [string length]; i++) {
NSString *strIndex1 = [string substringWithRange:NSMakeRange(i, 1)];
NSString *strIndex2 = [string substringWithRange:NSMakeRange(i + 1, 1)];
if ([strIndex1 isEqualTo:strIndex2]) {
[string deleteCharactersInRange:NSMakeRange(i + 1, 1)];
}
}
// 問題:刪除後索引未調整,導致漏檢或越界
i+1 變為新字符,但迴圈仍遞增 i,造成跳過檢查。i <= length 在刪除後 length 變小,易發生越界。NSMutableString *string = [NSMutableString stringWithFormat:@"aabbbssddffffiieeoo"];
for (NSInteger i = 0; i < string.length - 1; i++) {
for (NSInteger j = i + 1; j < string.length; j++) {
NSString *str1 = [string substringWithRange:NSMakeRange(i, 1)];
NSString *str2 = [string substringWithRange:NSMakeRange(j, 1)];
if ([str1 isEqualToString:str2]) {
[string deleteCharactersInRange:NSMakeRange(j, 1)];
j--; // 刪除後當前位置換新字符,需重新比較
} else {
break; // 遇到不同字符,結束內層迴圈,外層進入下一組
}
}
}
NSLog(@"%@", string); // 輸出: abdfio
i 定位「當前基準字符」。j 向後掃描相同字符並刪除。j-- 確保新移入位置的字符也被比較。break 優化:一旦遇到不同字符,後續必不相同(因只刪除相鄰重複),直接跳出內層。NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(.)\\1+" options:0 error:nil];
NSString *result = [regex stringByReplacingMatchesInString:string options:0 range:NSMakeRange(0, string.length) withTemplate:@"$1"];
// 結果同樣保留每組相鄰重複字符的第一個
短字串雙層迴圈足夠;長字串(>10k 字符)建議用正則或單次遍歷構建新字串(O(n))。