我有很多基于算法的编码访谈(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;
}
答案 0 :(得分:2)
在编码面试中,您总是可以询问是否可以从库中使用这样的功能,但通常只要这样就不会使您无法解决问题。
例如,如果要求您实现排序,则不应通过调用库排序来执行排序。如果要求您实现一个完成某项任务的类,那么您不应该通过委托已经提供的类来执行该任务。
上面的耐心排序实现通常很好,因为所调用的库函数都没有与增长最长的子序列问题特别相关。
在编码面试中,你应该反过来考虑这个问题:这个问题是展示你技能的机会。你想炫耀什么?
答案 1 :(得分:2)
根据我的经验,通常使用内置排序,搜索等实用功能来解决通常可以解决的问题类型,但使用它们可能不是最有效的方法。例如,通过排序然后获取前k个项,可以简单地解决从无序列表中选择前k项的问题。但这不是最佳解决方案。在采访中,面试官可能会要求您提供替代解决方案。在测试站点上,您的代码可能会超出时间限制。
对于采访,与面试官讨论您提出的解决方案是个好主意。正如其他人所说,如果可以使用内置方法,询问面试官。面试问题通常是故意模糊的,无法引发这种对话。面试官对您的技术实力感兴趣,但也有兴趣了解您如何解决问题。这包括要求澄清要求是否不明确。