Problema: Dado un arreglo como [0, 1, 0, 3, 12] desplazar todos los ceros al final obteniendo [1, 3, 12, 0, 0]. Restricciones: mantener el orden relativo de los elementos distintos de cero, hacerlo in situ con espacio O(1) y preferiblemente en una sola pasada O(n).
Solución resumida: magia de dos punteros. Usamos un puntero left que señala la posición donde colocar el siguiente elemento distinto de cero y un puntero right que recorre el arreglo buscando elementos no nulos. Cada vez que encontramos un valor distinto de cero intercambiamos nums[left] con nums[right] y avanzamos left. De ese modo conservamos el orden y desplazamos los ceros hacia la derecha.
Implementación en Java: public class MoveZeros { public static void moveZeroes(int[] nums) { int left = 0; for (int right = 0; right < nums.length; right++) { if (nums[right] != 0) { int temp = nums[left]; nums[left] = nums[right]; nums[right] = temp; left++; } } } }
Ejemplo paso a paso con [0, 1, 0, 3, 12]: right=0 es cero se ignora; right=1 vale 1 se intercambia con left=0 resultando [1, 0, 0, 3, 12] y left pasa a 1; right=2 es cero se ignora; right=3 vale 3 se intercambia con left=1 resultando [1, 3, 0, 0, 12] y left pasa a 2; right=4 vale 12 se intercambia con left=2 resultando [1, 3, 12, 0, 0]. Resultado final [1, 3, 12, 0, 0].
Invariante clave: todo lo que está antes de left contiene únicamente elementos distintos de cero en su orden relativo original. left sólo avanza cuando colocamos un no-cero y right recorre de izquierda a derecha, lo que garantiza estabilidad.
Error común a evitar: incrementar left fuera del bloque condicional if provocará que left avance también cuando el elemento actual sea cero, perdiendo la posición correcta para futuros no-ceros. Asegúrese de colocar left++ dentro del if.
Casos de intercambio: si left == right el intercambio no cambia nada; si left < right intercambiamos un no-cero con un cero a su izquierda moviendo el no-cero hacia adelante y el cero hacia atrás.
Análisis: complejidad temporal O(n) en una sola pasada y complejidad espacial O(1) usando solo dos variables adicionales. Es estable en el sentido de que mantiene el orden relativo de los elementos distintos de cero y se hace in situ.
Patrón: particionado con dos punteros. left mantiene la sección buena y right explora para encontrar elementos que rellenan esa sección. Este patrón sirve para problemas como mover números negativos a la izquierda, separar pares e impares, y el clásico Dutch National Flag para tres categorías.
Variaciones para practicar: eliminar todas las apariciones de un valor, eliminar duplicados, ordenar colores (0, 1, 2), o particionar un arreglo según una condición.
Mentalidad: piensa en left como un cursor con la regla simple todo lo anterior es lo que queremos en el resultado final. Al encontrar un no-cero colócalo en el cursor y avanza. Al encontrar un cero ignóralo y espera al siguiente no-cero.
En Q2BSTUDIO desarrollamos soluciones a medida y ayudamos a equipos a implementar algoritmos eficientes como este dentro de aplicaciones reales. Si necesitas una aplicación optimizada o un sistema de procesamiento de datos con lógica eficiente consulta nuestras soluciones de software a medida y aplicaciones a medida o descubre cómo aplicamos inteligencia artificial en proyectos empresariales en ia para empresas y agentes IA. Somos especialistas en inteligencia artificial, ciberseguridad, servicios cloud aws y azure, servicios inteligencia de negocio y desarrollo de aplicaciones a medida, además de ofrecer experiencia en power bi y agentes IA para mejorar la toma de decisiones.
Palabras clave: aplicaciones a medida, software a medida, inteligencia artificial, ciberseguridad, servicios cloud aws y azure, servicios inteligencia de negocio, ia para empresas, agentes IA, power bi. Si quieres que integremos este tipo de lógica en tu proyecto, optimicemos el rendimiento o diseñemos una solución completa ponte en contacto con Q2BSTUDIO.