переполнение кучного буфера по адресу

#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. Спасибо, что нашли время, чтобы помочь мне. Я загрузил отладчик.