challenge 文字列の反転

与えられた文字列sを前後逆転したものを返す関数reverse_stringを作成してください。 ただし、sはShift-JISでエンコードされている文字列だと仮定して構いません。

サンプル入出力

>>> print reverse_string("Hello")
olleH
>>> print reverse_string("こんにちは")
はちにんこ
>>> print reverse_string("濁点(だくてん)")
)んてくだ(点濁

Posted feedbacks - Objective-C

入力Shift-JISってことなんでC文字列にしてみた。
C文字列のまま処理してもいいけどそれだとまるっきりCのコードなので、
一度NSStringに変換後処理して最後にまたC文字列に戻すという…無駄ですね。
無駄でした。

こういうとこはCで書くか、
最初に全部NSStringにしちゃってプログラム中は一貫してNSStringで処理するか、
どっちかかな。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#import <Foundation/Foundation.h>

const char * reverse_string(const char * cString, NSStringEncoding encoding)
{
    NSString* aString = [NSString stringWithCString:cString encoding:encoding];
    NSMutableString* reversedString = [NSMutableString string];
    int index;
    for (index = [aString length] - 1; index >= 0; index--) {
        [reversedString appendString:[aString substringWithRange:NSMakeRange(index, 1)]];
    }
    return [reversedString cStringUsingEncoding:encoding];
}

int main(int argc, const char *argv) {
    NSAutoreleasePool* pool = [NSAutoreleasePool new];
      
    const char * ss[3];
    ss[0] = [@"Hello" cStringUsingEncoding:NSShiftJISStringEncoding];
    ss[1] = [@"こんにちは" cStringUsingEncoding:NSShiftJISStringEncoding];
    ss[2] = [@"濁点(だくてん)" cStringUsingEncoding:NSShiftJISStringEncoding];

    NSLog(@"%s", reverse_string(ss[0], NSShiftJISStringEncoding));
    NSLog(@"%s", reverse_string(ss[1], NSShiftJISStringEncoding));
    NSLog(@"%s", reverse_string(ss[2], NSShiftJISStringEncoding));

    [pool release];
    return 0;
}

こっちはNSStringに反転メソッドを追加したもの。
あと、再帰にしてみた。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#import <Foundation/Foundation.h>

@interface NSString (Reverse)
- (NSString *)reversedString;
@end

@implementation NSString (Reverse)
- (NSString *)reversedString
{
    if ([self length] > 1)
    {
        return [[[self substringFromIndex:1] reversedString] stringByAppendingString:[self substringToIndex:1]];
    }
    else
    {
        return self;
    }
}
@end

int main(int argc, const char *argv) {
    NSAutoreleasePool* pool = [NSAutoreleasePool new];

    NSLog([@"Hello" reversedString]);
    NSLog([@"こんにちは" reversedString]);
    NSLog([@"濁点(だくてん)" reversedString]);

    [pool release];
    return 0;
}

appendFormat を使ってみました。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#import <Foundation/Foundation.h>

const char* reverse_string(const char* input)
{
  NSString* str = [NSString stringWithCString:input encoding:NSShiftJISStringEncoding];
  NSMutableString* result = [NSMutableString string];
  int i;
  for (i=[str length]-1; i>=0; i--) {
    [result appendFormat:@"%C", [str characterAtIndex:i]];
  }
  return [result cStringUsingEncoding:NSShiftJISStringEncoding];
}

int main(int argc, const char** argv)
{
  NSAutoreleasePool* pool = [NSAutoreleasePool new];
      
  const char* s[3];
  s[0] = [@"Hello" cStringUsingEncoding:NSShiftJISStringEncoding];
  s[1] = [@"こんにちは" cStringUsingEncoding:NSShiftJISStringEncoding];
  s[2] = [@"濁点(だくてん)" cStringUsingEncoding:NSShiftJISStringEncoding];
  
  int i;
  for (i=0; i<3; i++) {
    NSLog(@"%s", reverse_string(s[i]));
  }

  [pool release];
  return 0;
}

Index

Feed

Other

Link

Pathtraq

loading...