【问题标题】:How to solve HackerRank problems in Objective-C如何在 Objective-C 中解决 HackerRank 问题
【发布时间】:2020-05-20 05:25:14
【问题描述】:

谁能解释如何在 Objective-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]];

【问题讨论】:

    标签: objective-c


    【解决方案1】:

    “从 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)
    • 避免使用 self。这是函数式编程。
    • 使用 C 函数,而不是 Objective-C 方法,含义,使用

    而不是

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

    使用

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

    快乐编程。

    【讨论】:

    • 我完全不知道如何使用 Objective C 来解决hackerrank 中的一个简单问题。我在hackerrank 中尝试了一个有这个楼梯问题的示例测试。我对如何在 SolutionClass 中获取 n 的值、如何打印该值以检查它是否工作、如何执行以及如何打印输出感到困惑。我尝试搜索网络,但无法正确理解。如果有人可以将我重定向到正确的方向,显示示例教程,解决某些问题的视频教程链接,将有很大帮助。谢谢!
    • 看起来如果我用“NSLog”替换“printf”会失败。为什么?
    • 不同行中的多个字符串怎么样?
    • @allenlinli 因为 NSLog 不是标准输出。 @Zangetsu 使用 \n 分隔行
    【解决方案2】:

    刚刚完成其中一项测试后,我选择立即退出 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 可选项的崩溃也比样板文件要好。

    【讨论】:

    • NSArrayNSMutableArray 可用,没问题吗?与仅使用原始 C 数组相比,它们使处理某些问题变得容易得多。
    【解决方案3】:
    #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;
    }
    

    应该这样做。

    【讨论】:

      【解决方案4】:

      您的问题对于 SO 来说实在是太笼统了,如果它很快就会关闭,请不要感到惊讶。一般来说,您需要提出具体问题,展示您尝试过的方法等。但如果您只是在获得一些提示后就可以开始......

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

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

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

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

      【讨论】:

      • 是的,我同意。可能我在想有人已经成功提交了一个解决方案,并且只分享了输入和输出机制。我正在编辑问题并提供更多解释。
      • HackerRank 上的example problem 使用了 C stdio 函数,也许你应该试试这些?
      • 是的,看来这是唯一的方法。将等待几天等待任何其他选择(就像对任何其他选择感到好奇)而不是关闭问题。
      【解决方案5】:

      我创建了 github 存储库,其中包含一些用 Objective-c 编写的hackerrank 问题解决方案。它还处于起步阶段,您也可以通过添加您的解决方案来贡献自己的力量。

      HackerRank for Objective-C

      【讨论】:

        【解决方案6】:

        由于 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];
        }
        

        如果 nint 类型,您可以将其解读为:

        scanf("%d", &n);
        

        【讨论】:

          猜你喜欢
          • 2022-06-23
          • 1970-01-01
          • 1970-01-01
          • 2021-11-04
          • 1970-01-01
          • 2010-10-24
          • 1970-01-01
          • 1970-01-01
          • 2016-01-24
          相关资源
          最近更新 更多