#c #vector
#c #вектор
Вопрос:
Учитывая массив, содержащий n различных чисел, взятых из 0, 1, 2, …, n, найдите то, которого не хватает в массиве.
Пример 1:
Входные данные: [3,0,1]
Вывод: 2
Мой подход заключается в том, чтобы прочитать каждый элемент, а затем умножить этот индекс на -1. Какой бы индекс массива ни оставался положительным, он отсутствует (я должен обрабатывать ноль отдельно)
Мой код вызывает переполнение кучи в строке, где я пытаюсь умножить элемент на -1
class Solution {
public:
int missingNumber(vector<int>amp; nums) {
bool zeroFound = false;
for(auto i = nums.begin(); i < nums.end(); i ) {
if(*i == 0) {
zeroFound = true;
} else {
int value = *i;
printf("Inner %d %dn", value, nums[value -1]);
//nums[value - 1] = value * (-1);
}
}
if(!zeroFound) {
return 0;
} else {
int count = 1;
for(auto i = nums.begin(); i < nums.end(); i , count ) {
if(*i > 0) {
return count;
}
}
}
return -1;
}
};
Комментарии:
1. Это какая-то глупая задача вроде ранга хакера. Результатом является
((nums.size() 1)*nums.size())/2 - std::accumulate(nums.begin(),nums.end(),0)
2. ericlippert.com/2014/03/05/how-to-debug-small-programs
3. Спасибо, это полезно.
Ответ №1:
Научитесь использовать отладчик.
Ваша проблема в том, что после первого выполнения цикла входные данные являются [3, 0, -3]
. Когда вы обрабатываете последний элемент, вы пытаетесь получить доступ к элементу -4, который никогда не закончится хорошо.
Даже если вы используете абсолютное значение элемента, при вашем первом запуске будет перезаписан последний элемент, поэтому вы больше не сможете определить, был ли ввод [3, 0, 1]
или [3, 0, 2]
.
Комментарии:
1. @melpomene Спасибо! Исправлено.
2. Спасибо, что нашли время, чтобы помочь мне. Я загрузил отладчик.