В массив1 не добавляются значения массива2 в цикле. По одной из задач с leetcode
public static void main(String[] args) {
int[] test1 = {1,2,3,0,0,0};
int[] test2 = {2,5,6};
Main main = new Main();
main.merge(test1, test1.length, test2, test2.length);
}
public void merge(int[] nums1, int m, int[] nums2, int n) {
int counterN = 0;
for(int j = m; j < n; j++){
nums1[j] = nums2[counterN];
counterN++;}
for (int i:
nums1) {
System.out.println(i);
}
Подскажите, почему в цикле
for nums1[j] = nums2[counterN];
не добавляет в массив nums1 вместо нулей значения из массива nums2?
То есть output получается [1,2,3,0,0,0], хотя предполагал, что будет [1,2,3,2,5,6].
По условию задачи m и n - это длины массивов nums1 и nums2.
У nums1 реальная length на входе в метод m+n, реальная m = 3, n = 3, m+n = 6.
Нулями в массиве nums1 заменены "пустые" ячейки, в которые предполагается в дальнейшем записать числа из массива nums2.
Спасибо!
Ответы (1 шт):
Для простого добавления элементов второго массива в первый после m элементов достаточно переписать цикл и отсортировать заполненный первый массив (почему-то такое решение принимается):
import static java.util.Arrays.sort;
public void merge(int[] a, int m, int[] b, int n) {
for (int i = m, j = 0; i < a.length;) {
a[i++] = b[j++];
}
sort(a);
}
Если "читерское" использование встроенной / библиотечной сортировки не допускается, как по требованиям к производительности (сложность равна O((m + n) log (m + n))), так и по морально-этическим соображениям, следует поискать более быстрое линейное решение, например, за счёт использования промежуточного массива длиной m + n, содержимое которого затем будет скопировано в исходный первый массив:
public void merge(int[] a, int m, int[] b, int n) {
// создаем промежуточный массив
int[] c = new int[m + n]; // or a.length
int i = 0, j = 0, k = 0;
// записываем по очереди минимальные элементы из a и b, пока один из них не закончится
while (j < m && k < n) {
if (a[j] < b[k]) {
c[i++] = a[j++];
} else {
c[i++] = b[k++];
}
}
// копируем остаток первого массива если нужно
while (j < m) {
c[i++] = a[j++];
}
// копируем остаток второго массива если нужно
while (k < n) {
c[i++] = b[k++];
}
// перезаписываем содержимое исходного "большого" массива
for (i = 0; i < a.length; i++) {
a[i] = c[i];
}
}