快速纠正NSString的顺序?

时间:2012-01-25 13:03:54

标签: objective-c random nsstring nsmutablestring anagram

有没有人知道改变现有NSString或NSMutableString角色顺序的现有方法?无论如何我都有一个解决方法,但如果有一个现有的方法,它会很棒。

例如,给定字符串@" HORSE",一种方法可以返回@" ORSEH",@" SORHE",@" ROHES& #34;等等?

2 个答案:

答案 0 :(得分:5)

考虑这段代码:
.h档案:

@interface NSString (Scrambling)

+ (NSString *)scrambleString:(NSString *)toScramble;

@end

.m文件:

@implementation NSString (Scrambling)

+ (NSString *)scrambleString:(NSString *)toScramble {
   for (int i = 0; i < [toScramble length] * 15; i ++) {
      int pos = arc4random() % [toScramble length];
      int pos2 = arc4random() % ([toScramble length] - 1);
      char ch = [toScramble characterAtIndex:pos];
      NSString *before = [toScramble substringToIndex:pos];
      NSString *after = [toScramble substringFromIndex:pos + 1];
      NSString *temp = [before stringByAppendingString:after];
      before = [temp substringToIndex:pos2];
      after = [temp substringFromIndex:pos2];
      toScramble = [before stringByAppendingFormat:@"%c%@", ch, after];
   }
   return toScramble;
}

@end

不是最美丽的代码或执行,但完成工作。可能有一种(const char *)方法可以做到这一点,但这对我来说很好。快速测试显示在我的Mac上执行0.001021秒长度。

用法:

NSString *scrambled = [NSString scrambleString:otherString];

代码改编自另一种语言/伪代码

答案 1 :(得分:3)

您可以使用Durstenfeld对Fisher-Yates Shuffle的变体。

对于一个非常长的字符串,您可以通过将unichars复制到unichar缓冲区来节省大量的CPU时间和分配,然后使用c或c ++方法执行转换以交换字符。请注意,UTF8String不是您想要的缓冲区,也不应该改变它。然后从混洗缓冲区创建(或设置)新的NSString

有关Fisher Yates算法和C和C ++实现的更多信息can be found here