问题:
在没有任何消息/来电的myInterViewArray
中找到K的值
我得到了这个提示:
数组中的数字永远不会超过1-9。
NSArray *myInterViewArray = @[@2,@1,@3,@9,@9,@8,@7];
示例:
如果您发送3,则数组将返回myInterViewArray * 3
中的3个最大值。因此,在下面的示例中,K = 9 + 9 + 8。
-
在一次采访中我被问到这个问题并且完全被难过了。我能想到的第一个解决方案看起来像这样:
采访测试阵列:
[self findingK:myInterViewArray abc:3];
-(int)findingK:(NSArray *)myArray abc:(int)k{ // With Reverse Object Enumerator
myArray = [[[myArray sortedArrayUsingSelector:@selector(compare:)] reverseObjectEnumerator] allObjects];
int tempA = 0;
for (int i = 0; i < k; i++) {
tempA += [[myArray objectAtIndex:i] intValue];
}
k = tempA;
return k;
}
但显然这是一个很大的禁忌。他们希望我在不使用任何消息的情况下找到K的值。这意味着我无法使用sortedArrayUsingSelector
甚至reverseObjectEnumerator
。
现在到了这一点!
我已经考虑了很长一段时间了,我仍然无法想到没有消息的方法。有没有人有任何想法?
答案 0 :(得分:2)
只有一种方法可以做到这一点,即将数组桥接到CF类型然后使用普通C,例如:
NSArray *array = @[@1, @2, @3];
CFArrayRef cfArray = (__bridge CFArrayRef)(array);
NSLog(@"%@", CFArrayGetValueAtIndex(cfArray, 0));
但是,如果值为NSNumber
,您仍需要消息才能访问其数值。
问题的作者很可能对消息的概念没有很好的了解。也许他们认为下载和财产访问不是消息或其他东西。
在没有消息的情况下使用Obj-C中的对象是不可能的。每个属性访问,每个方法调用,每个方法初始化都是使用消息完成的。
重读这个问题,他们可能希望您在不使用库函数的情况下实现算法,例如: sort
(例如,您可以实现K堆并使用该堆来查找for
次迭代中的K个最高数字。)
答案 1 :(得分:0)
我认为你的意思是你不能改变原始数组。否则,这种限制是没有意义的。
这里可能有用的东西:
NSMutableArray *a = [NSMutableArray array];
for (NSNumber *num in array) {
BOOL shouldAdd = NO;
for (int i = a.count - 1; i >= k; i--) {
if ([a[i] intValue] < [num intValue]) {
shouldAdd = YES;
break;
}
}
if (shouldAdd) {
[a addObject:num];
}
}
int result = a[a.count - k];
for (int i = k; k < a.count; k++) {
result += [a[i] intValue];
}
return result;