почему этот код c ++ работает на Dev c ++, но не на веб-сайте? - PullRequest
1 голос
/ 06 мая 2020

Этот код принимает на вход массив целых чисел, где 1 ≤ a [i] ≤ n (n = размер массива), некоторые элементы появляются дважды, а другие появляются один раз. Мы должны вернуть недостающие числа.

Вход: [4,3,2,7,8,2,3,1] Выход: [5,6]

Работает нормально в Dev C ++, но когда я отправляю его на веб-сайт под названием leetcode, он выдает следующую ошибку

Сообщение об ошибке времени выполнения:

Строка 924: Char 9: время выполнения ошибка: привязка ссылки к нулевому указателю типа 'int' (stl_vector.h) РЕЗЮМЕ: UndefinedBehaviorSanitizer: undefined-behavior /usr/bin/../lib/gcc/x86_64-linux-gnu/8/../. ./../../include/c++/8/bits/stl_vector.h:933:9

vector<int> findDisappearedNumbers(vector<int>& nums) 
{   
  vector<int> temp;
  const int len = nums.size();
  int j=0;
  //sorted the array
  sort(nums.begin(), nums.end());
  //Added non-repetitive numbers into a temp vector
  for(int i=0;i<len;i++)
  {
    if(nums[i]!=nums[i+1])
    {
      temp[j++]=nums[i];
    }
  }
  //cleared nums vector for later use
  nums.erase(nums.begin(), nums.end());
  //added missing numbers in the sequence to both temp and nums vectors
  for(int i=0;i<len;i++)
  {
    if(temp[i]!=i+1)
    {
      temp.insert(temp.begin()+i, i+1);
      nums.insert(nums.end(),i+1);
    }
  } 
  return nums;
}

Я знаю, что этот код неэффективен, я только начал с c ++, а может кто подскажет, почему на сайте не работает?

Ответы [ 2 ]

5 голосов
/ 06 мая 2020

Ваш вектор temp станет пустым, когда вы это сделаете:

temp[j++]=nums[i];

Итак, вы получаете доступ к элементам вне пределов. Это неопределенное поведение , и вы не можете рассчитывать на результат. Все, что могло случиться. Компилятор больше не имеет никаких обязательств, если ваш код содержит UB.

1 голос
/ 06 мая 2020

Это нормально работает только в Dev C ++. Как говорится в сообщении об ошибке другого компилятора, в вашем коде есть неопределенное поведение. У Джеспера есть указатель один. Другой будет строка:

if(nums[i]!=nums[i+1])

Во время последней итерации i равно len-1, поэтому nums[i+1] пытается прочитать num[len], которого не существует. Вам нужно будет изменить l oop на:

for(int i=0;i<len-1;i++)

Второй l oop немного сложнее исправить. Вы используете len как ограничение, но это старая длина nums, и вы повторяете temp. Кроме того, при этом вы изменяете temp. Что вам нужно сделать, так это проверять размер temp после каждой итерации и сравнивать i с текущим числом:

for(int i=0;i<temp.size();i++)

В качестве примечания. Есть функции для очистки вектора / добавления элемента в конце. Вы можете найти полный список здесь .

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