
Question:
Write an algorithm that brings all nonzero elements to the left of the array, and returns the number of nonzero elements. Input : {1, 2, 0, 4, 3, 0, 5, 0}; Output : {1, 2, 4, 3, 5, 0, 0}; Input : {1, 2, 0, 0, 0, 3, 6}; Output : {1, 2, 3, 6, 0, 0, 0};
Solution:
To solve this problem first we can use for loop to check the value of the array element.
If the value is non-zero we do nothing, otherwise we will use temporary variable to swap the zero value with non-zero value.
const zeroTransfer = (arr) => {
let j = arr.length - 1;
for (let i = 0; i < arr.length; i++) {
if (arr[i] === 0) {
while (arr[j] === 0 && j > i) {
j--;
}
let temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
return arr;
}
Here is the another algorithm which uses count as index of the array:
const countZeros = (arr) => {
let count = 0;
for (let i = 0; i < arr.length; i++) {
if (arr[i] !== 0) {
arr[count++] = arr[i];
}
}
while (count < arr.length) {
arr[count++] = 0;
}
return arr;
}
Test Case Function:
const testCase = (expected, actual) => {
return `Expected: ${expected} Actual: ${actual}`;
}
console.log(testCase([1, 2, 4, 3, 5, 0, 0], countZeros([1, 2, 0, 4, 3, 0, 5, 0]));
console.log(testCase([1, 2, 0, 0, 0, 3, 6], countZeros([1, 2, 0, 0, 0, 3, 6]));