【问题标题】:Calculating value of K without messages在没有消息的情况下计算 K 的值
【发布时间】:2016-10-28 17:04:58
【问题描述】:

问题:

在没有任何消息/调用的情况下,在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。

现在进入重点!

我已经考虑了很长时间,但我仍然想不出没有消息的方法。有人有什么想法吗?

【问题讨论】:

  • 是我自己还是你真的指定了程序应该做什么?它应该找到什么?克?什么k?
  • 抱歉给您带来了困惑.. 我希望我的编辑能解决问题@luk2302
  • " 不使用任何消息" ?您返回 k 个最大值的加法,对吗?因为你的解释还不是很清楚
  • 你甚至可以在没有消息或数组长度的情况下访问数组下标吗?之后,它就像任何其他语言一样是普通的旧编程。但我认为前两件事是不可能的。
  • 那是他们在面试问题中使用的确切术语吗?听起来是不可能的。也许他们只是在测试你(说“不”);)

标签: objective-c


【解决方案1】:

只有一种方法可以做到这一点,那就是将数组桥接到 CF 类型,然后使用普通 C,例如:

NSArray *array = @[@1, @2, @3];
CFArrayRef cfArray = (__bridge CFArrayRef)(array);

NSLog(@"%@", CFArrayGetValueAtIndex(cfArray, 0));

但是,如果值为 NSNumber,您仍需要消息才能访问其数值。

问题的作者很可能对消息的概念没有很好的了解。也许他们认为下标和属性访问不是消息或其他东西。

在没有消息的情况下在 Obj-C 中使用对象是不可能的。每个属性访问、每个方法调用、每个方法初始化都是使用消息完成的。

重读问题,他们可能希望您在不使用库函数的情况下实现算法,例如sort(例如,您可以实现一个 K 堆并使用该堆在 for 迭代中找到 K 个最高数字)。

【讨论】:

  • +1 "问题的作者很可能对消息的概念没有很好的了解。"这样的问题挺好的。它可以快速显示您不想与哪些组合作。很高兴能快速解决这个问题,这样您就可以采访更好的团队。
  • 这种情况并不少见。 SE 工作场所 中有一些相关的问题,例如workplace.stackexchange.com/questions/4314/…
  • @Sulthan 你介意举一个算法/排序函数的例子吗?
  • @Filip 你可以检查stackoverflow.com/questions/11209556/…,一旦你有一个heap 实现,算法就相当简单了。它与堆排序中使用的算法相同,但堆排序需要一个 N 堆,而您只需要一个 K 堆。
【解决方案2】:

我认为这意味着您不能改变原始数组。否则,这种限制没有意义。

以下是可行的方法:

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;

【讨论】:

    猜你喜欢
    • 2017-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-27
    • 2013-10-30
    相关资源
    最近更新 更多