2016-06-26 2 views
0

Вопрос:Вычисление значения K без сообщений

Найдите значение K в myInterViewArray без каких-либо сообщений/звонков

Я получил эту подсказку:

чисел в массиве будет никогда не превышать 1-9.

NSArray *myInterViewArray = @[@2,@1,@3,@9,@9,@8,@7];

Пример:

Если вы отправляете 3, то массив будет возвращать 3 большие значения в myInterViewArray * 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.

Теперь важно!

Я думал об этом довольно долго, и я до сих пор не могу придумать подход без сообщений. У кого-нибудь есть идеи?

+3

Является ли это только мне или вы узлы действительно укажите, что должна делать программа? Что он должен найти? K? Что? – luk2302

+0

Извините за путаницу .. Надеюсь, что мой править очищает вещи до @ luk2302 –

+0

«без каких-либо сообщений»? Вы возвращаете добавление k самых больших значений, не так ли? Потому что ваше объяснение все еще не так ясно. – Larme

ответ

2

Существует только один способ сделать это, и что преодоление массива CF типа, а затем использовать обычный C, например:

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

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

Однако , если значение равно NSNumber, вам все равно понадобятся сообщения для доступа к его числовому значению.

Скорее всего, авторы вопроса не очень хорошо знали концепцию сообщений. Возможно, они думали, что подписка и доступ к собственности не являются сообщениями или чем-то еще.

Использование объектов в Obj-C без сообщений невозможно. Каждый доступ к свойствам, каждый вызов метода, каждая инициализация метода выполняется с использованием сообщений.

Перечитывая вопрос, они, вероятно, хотели, чтобы вы реализовали алгоритм без использования библиотечных функций, например. sort (например, вы можете реализовать K-кучу и использовать эту кучу, чтобы найти самые высокие числа K в итерации for).

+1

+1 «Скорее всего, авторы вопроса не очень хорошо знали концепцию сообщений». Этот вопрос довольно хорош. Он быстро показывает, с какими группами вы не хотите работать. Приятно быстро справиться с этим, чтобы вы могли провести собеседование с лучшей группой. –

+0

Это не так уж редко. На рабочем месте * SE есть некоторые связанные вопросы, например. http://workplace.stackexchange.com/questions/4314/how-to-tell-a-interviewer-that-he-is-wrong-on-a-technical-question – Sulthan

+0

@ Султан, не возражаете ли вы дать пример для алгоритм/функция сортировки? –

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; 
Смежные вопросы