如何解决Objective-C中的HackerRank问题

时间:2014-12-22 17:54:38

标签: objective-c

任何人都可以解释如何在目标C中进行黑客等级测试。特别是“从STDIN读取输入。打印输出到STDOUT”部分

如何在objective-c中读取输入和输出?

到目前为止我得到的是像

这样的输入
 NSFileHandle *fileHandler = [NSFileHandle fileHandleWithStandardInput];
 NSData *inputData = [fileHandler availableData];
 NSString *inputString = [[NSString alloc] initWithData:inputData encoding:NSUTF8StringEncoding];

但是要打印输出,以下内容不会在HackerRank控制台上打印任何内容(但在Xcode控制台上完美运行)

NSFileHandle* fileHandler=[NSFileHandle fileHandleWithStandardOutput];
[fileHandler writeData: [formattedString dataUsingEncoding: NSNEXTSTEPStringEncoding]];

6 个答案:

答案 0 :(得分:11)

“从STDIN读取输入。将输出打印到STDOUT”的最简单方法是使用scanf和printf。
这是一个 示例模板 ,可以帮助您入门:

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[]) {

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    int count;
    scanf("%d", &count);
    NSMutableArray *inputIntegers = [NSMutableArray new];

    for (int i=0; i<count; i++) {
        int inputElement;
        scanf("%d", &inputElement);
        [inputIntegers addObject:[NSNumber numberWithInt:inputElement]];
    }

    //to print a specific element:
    printf("printing element 0: %d", (int)[inputIntegers[0] integerValue]);

    [pool drain];
    return 0;
}

在你拍摄这段旅程之前,先做一些事情:

  • 确保已禁用ARC(在构建设置中搜索CLANG_ENABLE_OBJC_ARC,并将其设置为NO)
  • 避免使用自我。这是功能性编程。
  • 使用C函数,而不是Objective-C方法,意思是,使用

而不是

 - (NSInteger)sumOfNumbers : (NSInteger)a and:(NSInteger)b {
    return a + b;
}

使用

int sumOfNumbers(int a, int b){

    return a + b;
}

快乐编程。

答案 1 :(得分:3)

刚刚接受了其中一项测试,我选择立即退出main.m并进入Objective-C,如下所示:

#import <Foundation/Foundation.h>

//Objective-C helper class to take over from main.m

//.h
@interface MainClass : NSObject

+ (BOOL)startMain;

@end

//.m
@implementation MainClass

+ (BOOL)startMain {

    //Read the STDIN here using the Objective-C wrapper methods
    NSInteger n = [self readInt];

    [self printInt:n];

    NSArray *numbers = [self readIntArrayOfLength:n];

    [self printIntNumberArray:numbers];

    return YES;
}

+ (NSInteger)readInt {

    int n;

    scanf("%i",&n);

    return n;
}

+ (NSArray *)readIntArrayOfLength:(NSInteger)len {

    NSMutableArray *result = [NSMutableArray array];

    for (int i =0; i < len; i++) {

        [result addObject:[NSNumber numberWithInt:[self readInt]]];
    }

    return [result copy];
}

//Helpers to print an int and array of ints to STDOUT
+ (void)printInt:(NSInteger)i {

    printf("%li\n",(long)i);
}

+ (void)printIntNumberArray:(NSArray *)array {

    printf("[");

    [array enumerateObjectsUsingBlock:^(NSNumber *n, NSUInteger idx, BOOL * _Nonnull stop) {

        printf("%li",(long)[n integerValue]);

        if (idx < array.count-1) {
            printf(",");
        }
    }];

    printf("]\n");
}

@end

//This is what will actually run when you hit "Run Code"
int main(int argc, char * argv[]) {

    @autoreleasepool {
        return [MainClass startMain];
    }
}

现在,您可以使用Objective-C从这里做任何您喜欢的事情。

因此,在此示例中,示例输入为:

3
11 2 4

会产生这个输出:

3
[11,2,4]

本身没有用,但说明了成功阅读。

在Swift中它更简单,但无论如何都要完成相同的代码:

func readInt() -> Int? {

    if let ln = readLine() {
        return Int(ln)
    }

    return nil
}

func readIntArray() -> [Int]? {

     if let ln = readLine() {

        return ln.characters.split(" ").filter({ Int(String($0)) != nil }).map({ Int(String($0))! })
    }

    return nil
}

let n = readInt()!
let array = readIntArray()!

print(n)
print(array)

函数返回选项,因为即使您要强制解包输入,最好在代码中发生nil可选的崩溃,而不是样板。

答案 2 :(得分:2)

#import <Foundation/Foundation.h> 

int sum(int a, int b) {
   return a + b;
}

int main() {
   @autoreleasepool {
      int T;
      int A;
      int B;
      printf("Enter number of test cases: ");
      scanf("%d", &T);
      for (int i=0; i < T; i++) {
          scanf("%d", &A);
          scanf("%d", &B);
          printf("%d\n", sum(A,B));
      }
     }
   return 0;
}

应该这样做。

答案 3 :(得分:0)

你的问题对于SO来说真的太笼统了,如果它很快就会被关闭也不要感到惊讶。一般来说,您需要询问具体问题,展示您尝试过的内容等等。但是,如果您只是在提供一些提示后才能帮助您... ...

你不是说你是否已经是程序员或特别是了解Objective-C,假设两者:

  1. 在Xcode中查看命令行工具项目类型

  2. 查看NSFileHandle及其方法,例如fileHandleWithStandardInput

  3. 请注意,您还可以使用C stdio函数,根据需要将C样式转换为Objective-C样式字符串等。

答案 4 :(得分:0)

我创建了github repo,其中包含一些用objective-c编写的hackerrank问题解决方案。它处于起步阶段,也可以通过添加您的解决方案做出贡献。

HackerRank for Objective-C

答案 5 :(得分:0)

由于Objective-C是C的超集,因此可以使用C方法读取和打印:

NSInteger n;
char *input[25];
NSMutableArray *strings = [NSMutableArray array];
NSString *s;
NSString *temp;

scanf("%lu", &n);

for (NSInteger i = 0; i < n; ++i) {
    scanf("%s", input);
    s = [NSString stringWithUTF8String:input];
    [inputs addObject:s];
}

如果 n 类型为 int ,则可以将其读取为:

scanf("%d", &n);