objective-c - 关于NSString字符串反转的问题

【字号: 日期:2023-12-20浏览:41作者:雯心

问题描述

今天看到这个“Objective-C分割NSString”,有人用正则表达式进行解答,感觉很特别。所以就把以前遇到的字符串反转的问你拿出来讨论讨论,可不可以用正则表达式来解决呢?

下面是个最简单的实现的如有什么效率问题,边界问题也希望多给意见。

/**** NSString+Reverse.h ****/#import <Foundation/Foundation.h>@interface NSString (Reverse)- (NSString *)stringByReversed;@end/**** NSString+Reverse.m ****/#import 'NSString+Reverse.h'@implementation NSString (Reverse)- (NSString *)stringByReversed{ NSMutableString *s = [NSMutableString string]; for (NSUInteger i=self.length; i>0; i--) { [s appendString:[self substringWithRange:NSMakeRange(i-1, 1)]]; } return s;}@end分割线 3月24日补充

根据@ParagonLight同学的回答我用如下代码做了个测试:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@'ss.SSSS']; NSLog(@'S %@', [dateFormatter stringFromDate:[NSDate date]]); NSString *reversed = [string stringByReversed]; NSLog(@'E %@', [dateFormatter stringFromDate:[NSDate date]]);

测试用的字符串长度为:8970

记录了10次结果,我制作了一个图表(算法1为我问题中的;算法2为@ParagonLight同学的)objective-c - 关于NSString字符串反转的问题

只看代码的话算法2可以提高一半的效率,之所以花的时间比算法1高出许多,是因为每次循环都会生成一个新string对象,所耗费时间确实超乎我的预想了。

分割线 3月25日补充

由于算法1和算法3相差很小,为了让结果更明显,修改了测试用例,将测试字符串长度放大100倍,现在测试字符串长度为:897000objective-c - 关于NSString字符串反转的问题

@ParagonLight同学的算法3的性能提升还是很明显的

问题解答

回答1:

我这里用了stringByReplacingCharactersInRange:方法。但这个方法其实也是重新new了一个string,所以感觉还不是最高效的做法。其实可以将string转换成char数组,然后设定两个指针,分别指向数组的头和尾,然后依次交换指向的值,直到i>j。我本身接触iOS时间不长,对其特性还不是那么了解,有什么不对的地方也劳烦指出。

- (NSString *)stringByReversed{ NSUInteger i = 0; NSUInteger j = self.length - 1; NSString *temp; NSString *newString = self; NSLog(@'%@', self); while (i < j) {temp = [newString substringWithRange:NSMakeRange(i, 1)];newString = [newString stringByReplacingCharactersInRange:NSMakeRange(i, 1) withString:[self substringWithRange:NSMakeRange(j, 1)]];newString = [newString stringByReplacingCharactersInRange:NSMakeRange(j, 1) withString:temp];NSLog(@'%@',newString);i ++;j --; } NSLog(@'%@', newString); return newString;}分割线

试试看这个呢

-(NSString *)stringByReversed{ NSUInteger i = 0; NSUInteger j = self.length - 1; unichar characters[self.length]; while (i < j) {characters[j] = [self characterAtIndex:i];characters[i] = [self characterAtIndex:j];i ++;j --; } if(i == j)characters[i] = [self characterAtIndex:i]; return [NSString stringWithCharacters:characters length:self.length];}更新:算法4

目测是unichar数组越界了。干脆直接malloc。。。不过我不得不说,这已经不是OC了。。。

- (NSString *)stringByReversed{ uint64_t i = 0; uint64_t j = self.length - 1;// unichar characters[self.length]; unichar *characters = malloc(sizeof([self characterAtIndex:0]) * self.length); while (i < j) { characters[j] = [self characterAtIndex:i]; characters[i] = [self characterAtIndex:j]; i ++; j --; } if(i == j) characters[i] = [self characterAtIndex:i]; return [NSString stringWithCharacters:characters length:self.length];}

相关文章: