Top.Mail.Ru
Ответы

Задачка по СИ на вставку элемента в динамический массив.

Дан массив размерности n. Вставить перед каждым вторым четным элементом последний отрицательный элемент. В полученном массиве удалить все нулевые элементы. Дополнительный массив не использовать. (Допустим есть массив из чисел: 4, -3, 6, 7, -5. Тогда перед 6 должна стоять -7)

Проблем по нахождению последнего отрицательного элемента и удалению нулей нету.

Только авторизированные пользователи могут оставлять свои ответы
Дата
Популярность
Аватар пользователя
Новичок

Сперва об ошибках в коде.

Считать чётные элементы надо с начала, а не с конца, то есть цикл должен быть такой:

1
 for(int i = 0; i < n; ++i) 

Считать чётные элементы надо, то есть надо изменять переменную countEven:

1
 ++countEven % 2 == 0 

Считать надо чётные элементы, то есть проверять чётность надо до проверки количества чётных:

1
 (arr[i] % 2 == 0 && ++countEven % 2 == 0) 

Но основной недостаток кода в том, что постоянно перевыделяется память и перемещаются одни и те же элементы. При этом получается квадратичная сложность.

Я бы предложил сперва подсчитать количество добавляемых элементов, выделить нужный объём памяти, а потом копировать массив с конца, добавляя при необходимости новый элемент. Таким образом сложность остаётся линейной.

1234567891011121314
 int countToInsert = 0; 
int countEven = 0; 
for(int i = 0; i < n; ++i) 
  if(arr[i] % 2 == 0 && ++countEven % 2 == 0) ++countToInsert; 
 
int n2 = n + countToInsert; 
arr = realloc(arr, n2 * sizeof(*arr)); 
 
for(int i = n - 1; i >= 0; --i) { 
  arr[i + countToInsert] = arr[i]; 
  if(arr[i] % 2 == 0 && countEven-- % 2 == 0) arr[i + --countToInsert] = lastNegative; 
} 
 
n = n2;  


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

Кстати, а почему

Тогда перед 6 должна стоять -7


если последний отрицательный элемент -5?