Учитывая, что у вас могут быть дубликаты, я не вижу никакого способа сохранить какую-то запись, какие значения были замечены, которую вы можете прочитать на основе стоимости. Подходы, основанные на одном и том же разновидности односторонней хэширующей функции (два из которых были предложены, а затем убраны), не могут выполнять свою работу самостоятельно. Может быть, однако, что вы можете сэкономить усилия сканирования вашей записи замеченных значений после заполнения ее, объединив ее с хэш-подобной функцией. Например,
int find_missing_number(int array[], int n)
{
char checker[100] = {0};
int xor = XOR_OF_1_TO_100;
int i;
for(i = 0; i < n; i++) {
xor ^= (checker[array[i]] ? 0 : array[i] + 1);
checker[array[i]] = 1;
}
return xor - 1;
}
Это правда очень похожа на вашу версию, но я более уверен, что он будет работать, и я думаю, что это, вероятно, работает немного быстрее.
Отметьте, что я не объявляю никаких переменных register
- компилятор намного лучше, чем я, когда вы выбираете, какие переменные должны проживать в реестрах, а какие нет, и он не обязан брать мой совет по этому вопросу в любом случае ,
Кроме того, элементы checker
массива имеют тип char
, что позволяет в четыре раза больше, чтобы находиться в строке кэша процессора сразу, чем если бы они были типа int
(предполагая, что 1-байтовое char
с и 4-байтовый int
ы) ,
Обратите внимание, что я избегаю подсчета различных значений или иначе ветвящихся внутри цикла (тройное выражение может быть реализовано без ветки). Избегание счетного и условного оператора ускорит случай, когда действительно отсутствует одно значение, и может или не может на практике замедлить случай, когда ни один отсутствует. Коэффициент усиления может возникнуть из-за того, что он не имеет меньше кода - иногда такие упрощения могут позволить компилятору генерировать более эффективные последовательности команд.
Конечно, все дело в нежелательной (и проблема не указана), если может отсутствовать более одного значения.
Вы должны объяснить логику. Из структуры это выглядит как линейное время, которое лучше всего, о чем я могу думать. –
@luis Если значения могут быть повторены, то почему только один номерr пропущен? –
Это вопрос интервью? Возможно более одного недостатка? Является ли значение n всегда 99 (оно должно быть, если отсутствует только одно число, и массив содержит все остальные элементы из 0-99 один раз)? – user2407394