Ale*_*one 0 sorting algorithm objective-c data-structures
我有很多基于算法的编码面试 (coderpad.io) 和在线挑战,例如 Objective-c 中出现的 hackerrank。我不经常这样做,想了解是否允许我使用内置的排序、搜索和比较函数(如下所示)来解决算法问题。
在编码面试中,我是否必须假装 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;
}
Run Code Online (Sandbox Code Playgroud)
在编码面试期间,您总是可以询问是否可以使用库中的某个函数,但通常您可以,只要这不能让您免于实际解决问题。
例如,如果要求您实现排序,则不应通过调用库排序来实现。如果要求您实现一个完成某些任务的类,那么您不应该通过委托给已经提供来执行该任务的类来完成此任务。
上述耐心排序的实现通常没问题,因为所调用的库函数都与最长递增子序列问题无关。
在编码面试中,您确实应该从相反的角度思考这一点:问题是展示您技能的机会。你想炫耀什么?
根据我的经验,通常提出的问题类型可以使用内置的排序、搜索等实用函数来解决,但使用它们可能不是最有效的方法。例如,从无序列表中选择前 k 个项目可以通过排序然后取出前 k 个项目来轻松解决。但这不是最佳解决方案。在面试中,面试官可能会要求你提供替代解决方案。在测试站点上,您的代码可能会超出时间限制。
对于面试,最好与面试官讨论您提出的解决方案。正如其他人所说,询问面试官是否可以使用内置方法。为了引发此类对话,面试问题通常故意含糊其辞。面试官对你的技术实力感兴趣,但也对你如何解决问题感兴趣。这包括在要求不明确时要求澄清。