Given an array arr[] of random integers, the task is to push all the zero’s in the array to the start and all the one’s to the end of the array. Note that the order of all the other elements should be the same.
Example:
Input: arr[] = {1, 2, 0, 4, 3, 0, 5, 0}
Output: 0 0 0 2 4 3 5 1
Input: arr[] = {1, 2, 0, 0, 0, 3, 6};
Output: 0 0 0 2 3 6 1
Approach: Traverse the array from left to right and move all the elements which are not equal to 1 at the beginning and then put 1’s in the rest of the indices at the end of the array. Now, find the index of the last element which is not equal to 1 say lastInd and then starting from this index to the beginning of the array push all the elements which are not equal to 0 in the end till lastInd and then put 0’s in the beginning.
Below is the implementation of the above approach:
C++
#include <iostream>
using namespace std;
void printArr( int arr[], int n)
{
for ( int i = 0; i < n; i++)
cout << arr[i] << " " ;
}
void pushBinaryToBorder( int arr[], int n)
{
int count1 = 0;
for ( int i = 0; i < n; i++)
if (arr[i] != 1)
arr[count1++] = arr[i];
while (count1 < n)
arr[count1++] = 1;
int lastNonOne = 0;
for ( int i = n - 1; i >= 0; i--) {
if (arr[i] == 1)
continue ;
if (!lastNonOne)
lastNonOne = i;
if (arr[i] != 0)
arr[lastNonOne--] = arr[i];
}
while (lastNonOne >= 0)
arr[lastNonOne--] = 0;
}
int main()
{
int arr[] = { 1, 2, 0, 0, 0, 3, 6 };
int n = sizeof (arr) / sizeof (arr[0]);
pushBinaryToBorder(arr, n);
printArr(arr, n);
return 0;
}
|
C
#include <stdio.h>
void printArr( int arr[], int n)
{
for ( int i = 0; i < n; i++)
printf ( "%d " , arr[i]);
}
void pushBinaryToBorder( int arr[], int n)
{
int count1 = 0;
for ( int i = 0; i < n; i++)
if (arr[i] != 1)
arr[count1++] = arr[i];
while (count1 < n)
arr[count1++] = 1;
int lastNonOne = 0;
for ( int i = n - 1; i >= 0; i--) {
if (arr[i] == 1)
continue ;
if (!lastNonOne)
lastNonOne = i;
if (arr[i] != 0)
arr[lastNonOne--] = arr[i];
}
while (lastNonOne >= 0)
arr[lastNonOne--] = 0;
}
int main()
{
int arr[] = { 1, 2, 0, 0, 0, 3, 6 };
int n = sizeof (arr) / sizeof (arr[0]);
pushBinaryToBorder(arr, n);
printArr(arr, n);
return 0;
}
|
Java
import java.util.*;
class GFG
{
static void printArr( int arr[], int n)
{
for ( int i = 0 ; i < n; i++)
System.out.print(arr[i]+ " " );
}
static void pushBinaryToBorder( int arr[], int n)
{
int count1 = 0 ;
for ( int i = 0 ; i < n; i++)
if (arr[i] != 1 )
arr[count1++] = arr[i];
while (count1 < n)
arr[count1++] = 1 ;
int lastNonOne = 0 ;
for ( int i = n - 1 ; i >= 0 ; i--)
{
if (arr[i] == 1 )
continue ;
if (lastNonOne == 0 )
{
lastNonOne = i;
}
if (arr[i] != 0 )
arr[lastNonOne--] = arr[i];
}
while (lastNonOne >= 0 )
arr[lastNonOne--] = 0 ;
}
public static void main(String args[])
{
int arr[] = { 1 , 2 , 0 , 0 , 0 , 3 , 6 };
int n = arr.length;
pushBinaryToBorder(arr, n);
printArr(arr, n);
}
}
|
Python3
def printArr(arr, n) :
for i in range (n) :
print (arr[i],end = " " )
def pushBinaryToBorder(arr, n) :
count1 = 0
for i in range (n) :
if (arr[i] ! = 1 ) :
arr[count1] = arr[i]
count1 + = 1
while (count1 < n) :
arr[count1] = 1
count1 + = 1
lastNonOne = 0
for i in range (n - 1 , - 1 , - 1 ) :
if (arr[i] = = 1 ) :
continue
if ( not lastNonOne) :
lastNonOne = i
if (arr[i] ! = 0 ) :
arr[lastNonOne] = arr[i]
lastNonOne - = 1
while (lastNonOne > = 0 ) :
arr[lastNonOne] = 0
lastNonOne - = 1
if __name__ = = "__main__" :
arr = [ 1 , 2 , 0 , 0 , 0 , 3 , 6 ];
n = len (arr);
pushBinaryToBorder(arr, n)
printArr(arr, n)
|
C#
using System;
class GFG
{
static void printArr( int []arr, int n)
{
for ( int i = 0; i < n; i++)
Console.Write(arr[i] + " " );
}
static void pushBinaryToBorder( int [] arr, int n)
{
int count1 = 0;
for ( int i = 0; i < n; i++)
if (arr[i] != 1)
arr[count1++] = arr[i];
while (count1 < n)
arr[count1++] = 1;
int lastNonOne = 0;
for ( int i = n - 1; i >= 0; i--)
{
if (arr[i] == 1)
continue ;
if (lastNonOne == 0)
{
lastNonOne = i;
}
if (arr[i] != 0)
arr[lastNonOne--] = arr[i];
}
while (lastNonOne >= 0)
arr[lastNonOne--] = 0;
}
public static void Main()
{
int []arr = { 1, 2, 0, 0, 0, 3, 6 };
int n = arr.Length;
pushBinaryToBorder(arr, n);
printArr(arr, n);
}
}
|
Javascript
<script>
function printArr(arr, n)
{
for ( var i = 0; i < n; i++)
document.write( arr[i] + " " );
}
function pushBinaryToBorder(arr, n)
{
var count1 = 0;
for ( var i = 0; i < n; i++)
if (arr[i] != 1)
arr[count1++] = arr[i];
while (count1 < n)
arr[count1++] = 1;
var lastNonOne = 0;
for ( var i = n - 1; i >= 0; i--) {
if (arr[i] == 1)
continue ;
if (!lastNonOne) {
lastNonOne = i;
}
if (arr[i] != 0)
arr[lastNonOne--] = arr[i];
}
while (lastNonOne >= 0)
arr[lastNonOne--] = 0;
}
var arr = [ 1, 2, 0, 0, 0, 3, 6 ];
var n = arr.length;
pushBinaryToBorder(arr, n);
printArr(arr, n);
</script>
|
Time Complexity: O(N), where N represents the size of the given array.
Auxiliary Space: O(1), no extra space is required, so it is a constant.