在没有消息的情况下计算K的值

时间:2016-06-26 17:23:03

标签: objective-c

问题:

在没有任何消息/来电的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

现在到了这一点!

我已经考虑了很长一段时间了,我仍然无法想到没有消息的方法。有没有人有任何想法?

2 个答案:

答案 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;