переполнение кучи-буфера по адресу - PullRequest
0 голосов
/ 04 марта 2019

Учитывая массив, содержащий n различных чисел, взятых из 0, 1, 2, ..., n, найдите тот, который отсутствует в массиве.

Пример 1:

Ввод: [3,0,1]

Вывод: 2

Мой подход - прочитать каждый элемент, а затем умножить этот индекс на -1.Независимо от того, какой индекс массива остается положительным, тот, который отсутствует (мне приходится обрабатывать ноль отдельно)

Мой код вызывает переполнение кучи в строке, где я пытаюсь умножить элемент на -1

class Solution {
public:
    int missingNumber(vector<int>& 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 %d\n", 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 Ответ

0 голосов
/ 04 марта 2019

Научитесь пользоваться отладчиком.

Ваша проблема в том, что после первого прохода по циклу ввод будет [3, 0, -3].Когда вы обрабатываете последний элемент, вы пытаетесь получить доступ к элементу -4, который никогда не закончится хорошо.

Даже если вы используете абсолютное значение элемента, ваш первый запуск будет перезаписывать последний элемент -так что вы больше не можете сказать, был ли ввод [3, 0, 1] или [3, 0, 2].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...