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


任何人都可以解释如何在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]];

5045
2017-12-22 17:54


起源



答案:


“从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;
}

快乐的编程。


11
2018-01-31 06:23



我很困惑如何使用Objective C解决hackerrank中的一个简单问题。我在hackerrank中尝试了一个具有此阶梯问题的示例测试。我对如何在SolutionClass中获取n的值,如何打印该值以检查它是否正常工作,如何执行以及如何打印输出感到困惑。我尝试搜索网络,我无法理解它。如果有人可以正确指导我,请展示示例教程,解决一些问题的视频教程链接,将会有很大的帮助。谢谢! - nOOb iOS
如果我将“printf”替换为“NSLog”,它看起来会失败。为什么? - allenlinli
在单独的行中几个字符串怎么样? - Zangetsu
@allenlinli因为NSLog不是STDOUT。 @Zangetsu使用 \n 分开线 - William GP


答案:


“从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;
}

快乐的编程。


11
2018-01-31 06:23



我很困惑如何使用Objective C解决hackerrank中的一个简单问题。我在hackerrank中尝试了一个具有此阶梯问题的示例测试。我对如何在SolutionClass中获取n的值,如何打印该值以检查它是否正常工作,如何执行以及如何打印输出感到困惑。我尝试搜索网络,我无法理解它。如果有人可以正确指导我,请展示示例教程,解决一些问题的视频教程链接,将会有很大的帮助。谢谢! - nOOb iOS
如果我将“printf”替换为“NSLog”,它看起来会失败。为什么? - allenlinli
在单独的行中几个字符串怎么样? - Zangetsu
@allenlinli因为NSLog不是STDOUT。 @Zangetsu使用 \n 分开线 - William GP


刚刚接受了其中一个测试,我选择立即退出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可选的崩溃,而不是样板。


3
2018-04-08 19:17



NSArray 和 NSMutableArray 可用,没问题?与仅使用原始C数组相比,它们使一些问题的处理变得更加容易。 - Aaron Ash


#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;
}

应该这样做。


2
2018-05-07 09:15





你的问题对于SO来说真的太笼统了,如果它很快关闭,也不要感到惊讶。一般来说,您需要询问具体问题,展示您尝试过的内容等等。但是,如果您只是提出一些提示让您前进......

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

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

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

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


0
2017-12-22 19:45



是的我同意。可能是我认为某人已经成功提交了解决方案并只分享了输入和输出机制。我正在编辑这个问题并提供更多解释。 - object2.0
该 示例问题 在HackerRank上使用C stdio函数,也许你应该尝试那些? - CRD
是的,这是唯一的方法。对于任何其他替代方案将会等待几天(对于任何其他替代方案只是好奇)而不是关闭问题。 - object2.0


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

HackerRank for Objective-C


0
2018-01-17 20:25