在iOS中反转字符串

sar*_*ana 0 ios

我正在编写应该反转字符串的代码.当我运行以下代码时,它会抛出一个错误:

- (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)

Ila*_*ian 9

该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)


jpa*_*500 9

我想我会抛出另一个版本以防万一有人感兴趣..个人而言,我喜欢使用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)

(注意:我没有足够的声誉点来投票或评论答案,所以如果有人可以为我投票,我会很感激.我已经很长时间了,但现在想开始贡献更多!)