Удаление отрицательных элементов из массива

Удалить из массива все отрицательные элементы(под удаление следует понимать: исключение этого элемента из массива путем смещения всех следующих за ним элементов влево на 1 позицию; присваивание последнему элементу 0. Если нужно удалить 3 элемента, то сдвиг идет влево на 3 позиции, и 3 значения равны 0). Решение:

int nums[] = { -14, 10, -29, 15, -46, 74, -99, 22 };
        // показываю исходный массив
        for (int t = 0; t < nums.length; t++)
            System.out.print(nums[t] + " ");
        System.out.println();
        
        for (int t = 0; t < nums.length; t++) {
            if (nums[t] < 0) {
                for (int d = t; d < nums.length - 1; d++)
                    nums[d] = nums[d + 1];
                nums[nums.length - 1] = 0;
            }
        }

Это решение справедливо, когда элементы чередуются следующем образом (-14, 10, -29, 15, -46, 74, -99, 22) (то есть сначала "-" потом "+"). Как можно решить задачу в общем случае(то есть в любом порядке) ?


Ответы (2 шт):

Автор решения: MBo

"Сжатие" массива за линейное время:

int k = 0;   
for (int t = 0; t < nums.length; t++) {
       if (nums[t] < 0) 
          k++;
       else 
          nums[t - k] = nums[t];
 }

и в конце k нулей заполните

for (int t = nums.length - k; t < nums.length; t++)
    nums[t] = 0;
→ Ссылка
Автор решения: Алексей Шиманский
int nums[] = { -14, 10, -29, 15, -46, 74, -99, 22 };
int result[] = new int[nums.length];

Arrays.sort(nums); // сортируем исходный массив

// Пробегаемся а обратном порядке
for (int i = nums.length - 1, j = 0; i > 0; --i, ++j) {
    // Если число положительное - добавляем его в результирующий,
    // иначе добавляем 0
    result[j] = nums[i] > 0 ? nums[i] : 0; 
}
→ Ссылка