算法 - 我可以使用内置实用程序函数进行在线编码访谈和挑战吗?

时间:2018-03-01 13:39:48

标签: objective-c algorithm sorting data-structures

我有很多基于算法的编码访谈(coderpad.io)和hackerrank等在线挑战出现在Objective-c中。我不经常这样做,想要了解我是否允许使用内置的排序,搜索和比较下面的函数来解决算法问题。

在编码面试中,我是否必须假装Objective-c没有排序,撤销和其他工具?

或者是一切公平的游戏,只是解决方案?

如果有更好的媒介提出这个问题,请告诉我在哪里发布。

从这里开始:https://rosettacode.org/wiki/Longest_increasing_subsequence#Objective-C

#import <Foundation/Foundation.h>

@interface Node : NSObject {
@public
  id val;
  Node *back;
}
@end

@implementation Node
@end

@interface NSArray (LIS)
- (NSArray *)longestIncreasingSubsequenceWithComparator:(NSComparator)comparator;
@end

@implementation NSArray (LIS)
- (NSArray *)longestIncreasingSubsequenceWithComparator:(NSComparator)comparator {
  NSMutableArray *pileTops = [[NSMutableArray alloc] init];
  // sort into piles
  for (id x in self) {
    Node *node = [[Node alloc] init];
    node->val = x;
    int i = [pileTops indexOfObject:node
                      inSortedRange:NSMakeRange(0, [pileTops count])
                            options:NSBinarySearchingInsertionIndex|NSBinarySearchingFirstEqual
                    usingComparator:^NSComparisonResult(Node *node1, Node *node2) {
                      return comparator(node1->val, node2->val);
                    }];
    if (i != 0)
      node->back = pileTops[i-1];
    pileTops[i] = node;
  }

  // follow pointers from last node
  NSMutableArray *result = [[NSMutableArray alloc] init];
  for (Node *node = [pileTops lastObject]; node; node = node->back)
    [result addObject:node->val];
  return [[result reverseObjectEnumerator] allObjects];
}
@end

int main(int argc, const char *argv[]) {
  @autoreleasepool {
    for (NSArray *d in @[@[@3, @2, @6, @4, @5, @1],
         @[@0, @8, @4, @12, @2, @10, @6, @14, @1, @9, @5, @13, @3, @11, @7, @15]])
      NSLog(@"an L.I.S. of %@ is %@", d,
            [d longestIncreasingSubsequenceWithComparator:^NSComparisonResult(id obj1, id obj2) {
        return [obj1 compare:obj2];
      }]);
  }
  return 0;
}

2 个答案:

答案 0 :(得分:2)

在编码面试中,您总是可以询问是否可以从库中使用这样的功能,但通常只要这样就不会使您无法解决问题。

例如,如果要求您实现排序,则不应通过调用库排序来执行排序。如果要求您实现一个完成某项任务的类,那么您不应该通过委托已经提供的类来执行该任务。

上面的耐心排序实现通常很好,因为所调用的库函数都没有与增长最长的子序列问题特别相关。

在编码面试中,你应该反过来考虑这个问题:这个问题是展示你技能的机会。你想炫耀什么?

答案 1 :(得分:2)

根据我的经验,通常使用内置排序,搜索等实用功能来解决通常可以解决的问题类型,但使用它们可能不是最有效的方法。例如,通过排序然后获取前k个项,可以简单地解决从无序列表中选择前k项的问题。但这不是最佳解决方案。在采访中,面试官可能会要求您提供替代解决方案。在测试站点上,您的代码可能会超出时间限制。

对于采访,与面试官讨论您提出的解决方案是个好主意。正如其他人所说,如果可以使用内置方法,询问面试官。面试问题通常是故意模糊的,无法引发这种对话。面试官对您的技术实力感兴趣,但也有兴趣了解您如何解决问题。这包括要求澄清要求是否不明确。