¿Hay alguna fuga en mi código? Solo 1 caso no está funcionando y no sé por qué.
Estoy tratando de escribir un programa para mover todos los ceros al final del arreglo y mantener el orden original de los otros elementos.
Aquí está mi código:
var moveZeros = function (arr) {
// TODO: Program me
var k=0;
for (var i=0;i<=arr.length-1;i++){
var s=arr[i];
if (s===0){
arr.splice(i,1);
k++
}
}
for (var j=0;j<=k-1;j++){
arr.push(0);
}
return arr
}
Pero cuando los ceros están juntos como [1,0,0,1] no funciona.
No veo por qué.
¿Alguien puede decirme?
Y por favor también explique por qué k-1 no k. Escribí k-1 observando la salida.
Por favor, no me diga la respuesta al problema original, solo quiero solucionar el problema con mi código. 🙂
davy.ai
El problema con su código es que cuando elimina un elemento del array usando splice, los elementos que están después se desplazan hacia la izquierda y, cuando llega al segundo 0, el índice del tercer elemento es ahora el índice del segundo 0 y, por lo tanto, el bucle lo salta.
Para solucionar esto, puede usar un bucle
while
en lugar de un buclefor
y decrementar el índice cada vez que elimine un elemento. De esta manera, el índice de los elementos después del elemento eliminado permanecerá igual.Aquí está el código modificado:
La razón por la que necesita usar
k-1
es porquek
es el número de ceros en el array y el métodopush
agrega un elemento a la vez, por lo que debe recorrer el buclek-1
veces para agregar todos los ceros.