A continuación se muestra la pregunta de leetcode: "el problema es cuando uso sort concat cualquier otro método en nums1, es bot modificando nums1 a menos que lo esté vaciando y presionando nuevos datos. El código a continuación funciona, pero ¿qué pasa si no quiero crear nums11 y realizar todos los métodos en nums1".
Entrada: nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3 Se le dan dos matrices de números enteros nums1 y nums2, ordenadas de forma no decreciente order, y dos enteros m y n, que representan el número de elementos en nums1 y nums2 respectivamente.
Combine nums1 y nums2 en una sola matriz ordenada en orden no decreciente.
La función no debe devolver la matriz ordenada final, sino almacenarla dentro de la matriz nums1. Para adaptarse a esto, nums1 tiene una longitud de m + n, donde los primeros m elementos indican los elementos que deben fusionarse, y los últimos n elementos se establecen en 0 y deben ignorarse. nums2 tiene una longitud de n.
var merge = function(nums1, m, nums2, n) { let nums11 = []; for(let i = 0; i<m; i++){ nums11.push(nums1[i]) } nums1.length = 0; nums11 = nums11.concat(nums2); nums11.sort((a,b) => { return ab}); for(let i = 0; i<nums11.length;i++){ nums1.push(nums11[i]) } };Tal vez puedas probar algo como esto.
for(let i = 0; i<n ; i++){ nums1[i+m-1] = nums2[i]; // adding nums2 elements to the elements with value 0 in nums1 } nums1.sort((a,b) => {return ab}); return nums1;En cuanto a la razón por la que no se modifica, podría deberse a las restricciones en la pregunta. No le permitirá agregar más elementos a nums1 porque ya tiene el tamaño que debe tener para que la solución encaje en él.
Si revisa el bucle for con cuidado, estamos empujando los elementos a la matriz nums1. Elimina la línea nums1.length=0; y en lugar de insertar elementos en el nums1. Intente cambiar el elemento en i-ésimo índice. Eso resolverá el problema. Como esto
nums1[i]=(nums11[i])Este es el código completo.
function merge(nums1, m, nums2) { let nums11 = []; for(let i = 0; i<m; i++){ nums11.push(nums1[i]) } nums11 = nums11.concat(nums2); nums11.sort((a,b) => { return ab}); for(let i = 0; i<nums11.length;i++){ nums1[i]=(nums11[i]) } };El código en la pregunta hace que la longitud de la matriz num1 sea 12.
Espero que resuelva el problema.
El requisito de la pregunta es modificar la matriz en el lugar y tampoco usar un método de clasificación integrado.
Considere el siguiente enfoque:
i y j que apunten al último índice ( excluyendo el espacio vacío ) de las matrices nums1 y nums2 respectivamente.k que apunte al último índice de nums1 , aquí es donde insertaríamos valores durante la iteración.nums2 .k -ésimo índice. function merge(nums1, m, nums2, n) { let i = m - 1, j = n - 1, k = m + n - 1; while (j >= 0) { if (nums1[i] >= nums2[j]) { nums1[k] = nums1[i]; i -= 1; } else { nums1[k] = nums2[j]; j -= 1; } k -= 1; } } const nums1 = [1, 4, 8, 11, 0, 0, 0, 0, 0, 0]; const nums2 = [2, 3, 4, 7, 8, 10]; merge(nums1, nums1.length - nums2.length, nums2, nums2.length); console.log(nums1);