我正在编写应该反转字符串的代码.当我运行以下代码时,它会抛出一个错误:
- (NSString*) reversingName:(NSString *)myNameText
{
NSString *result;
int len = [myNameText length];
NSMutableString *reverseName = [[NSMutableString alloc] initWithCapacity:len];
for(int i=len;i>0;i--)
{
[reverseName appendFormat:[NSString stringWithFormat:@"%c",[myNameText characterAtIndex:i]]];
}
result = reverseName;
return result;
}
Run Code Online (Sandbox Code Playgroud)
该for环线应该如下:
for(int i=len-1;i>=0;i--)
Run Code Online (Sandbox Code Playgroud)
所以你的方法应该是
- (NSString*) reversingName:(NSString *)myNameText
{
int len = [myNameText length];
NSMutableString *reverseName = [[NSMutableString alloc] initWithCapacity:len];
for(int i=len-1;i>=0;i--)
{
[reverseName appendString:[NSString stringWithFormat:@"%c",[myNameText characterAtIndex:i]]];
}
return [reverseName autorelease];
}
Run Code Online (Sandbox Code Playgroud)
我想我会抛出另一个版本以防万一有人感兴趣..个人而言,我喜欢使用NSMutableString的更清洁的方法,但如果性能是最高优先级,那么这个更快:
- (NSString *)reverseString:(NSString *)input {
NSUInteger len = [input length];
unichar *buffer = malloc(len * sizeof(unichar));
if (buffer == nil) return nil; // error!
[input getCharacters:buffer];
// reverse string; only need to loop through first half
for (NSUInteger stPos=0, endPos=len-1; stPos < len/2; stPos++, endPos--) {
unichar temp = buffer[stPos];
buffer[stPos] = buffer[endPos];
buffer[endPos] = temp;
}
return [[NSString alloc] initWithCharactersNoCopy:buffer length:len freeWhenDone:YES];
}
Run Code Online (Sandbox Code Playgroud)
我还写了一个快速测试,以便将它与更传统的NSMutableString方法(我在下面也包括在内)进行比较:
// test reversing a really large string
NSMutableString *string = [NSMutableString new];
for (int i = 0; i < 10000000; i++) {
int digit = i % 10;
[string appendFormat:@"%d", digit];
}
NSTimeInterval startTime = [[NSDate date] timeIntervalSince1970];
NSString *reverse = [self reverseString:string];
NSTimeInterval elapsedTime = [[NSDate date] timeIntervalSince1970] - startTime;
NSLog(@"reversed in %f secs", elapsedTime);
Run Code Online (Sandbox Code Playgroud)
结果是:
使用NSMutableString方法(下) - "在3.720631秒内反转"
使用unichar*缓冲方法(上图) - "在0.032604秒内反转"
仅供参考,这是用于此比较的NSMutableString方法:
- (NSString *)reverseString:(NSString *)input {
NSUInteger len = [input length];
NSMutableString *result = [[NSMutableString alloc] initWithCapacity:len];
for (int i = len - 1; i >= 0; i--) {
[result appendFormat:@"%c", [input characterAtIndex:i]];
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
(注意:我没有足够的声誉点来投票或评论答案,所以如果有人可以为我投票,我会很感激.我已经很长时间了,但现在想开始贡献更多!)