Given n binary strings, return their sum (also a binary string).
Examples:
Input: arr[] = ["11", "1"]
Output: "100"
Input : arr[] = ["1", "10", "11"]
Output : "110"
Approach 1:
Algorithm
- Initialize the ‘result’ as an empty string.
- Traverse the input from i = 0 to n-1.
- For each i, add arr[i] to the ‘result’. How to add ‘result’ and arr[i]? Start from the last characters of the two strings and compute the digit sum one by one. If the sum becomes more than 1, then store carry for the next digit. Make this sum as the ‘result’.
- The value of ‘result’ after traversing the entire input is the final answer.
Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
string addBinaryUtil(string a, string b)
{
string result = "" ;
int s = 0;
int i = a.size() - 1, j = b.size() - 1;
while (i >= 0 || j >= 0 || s == 1) {
s += ((i >= 0) ? a[i] - '0' : 0);
s += ((j >= 0) ? b[j] - '0' : 0);
result = char (s % 2 + '0' ) + result;
s /= 2;
i--;
j--;
}
return result;
}
string addBinary(string arr[], int n)
{
string result = "" ;
for ( int i = 0; i < n; i++)
result = addBinaryUtil(result, arr[i]);
return result;
}
int main()
{
string arr[] = { "1" , "10" , "11" };
int n = sizeof (arr) / sizeof (arr[0]);
cout << addBinary(arr, n) << endl;
return 0;
}
|
Java
class GFG
{
static String addBinaryUtil(String a, String b)
{
String result = "" ;
int s = 0 ;
int i = a.length() - 1 , j = b.length() - 1 ;
while (i >= 0 || j >= 0 || s == 1 )
{
s += ((i >= 0 ) ? a.charAt(i) - '0' : 0 );
s += ((j >= 0 ) ? b.charAt(j) - '0' : 0 );
result = s % 2 + result;
s /= 2 ;
i--;
j--;
}
return result;
}
static String addBinary(String arr[], int n)
{
String result = "" ;
for ( int i = 0 ; i < n; i++)
{
result = addBinaryUtil(result, arr[i]);
}
return result;
}
public static void main(String[] args)
{
String arr[] = { "1" , "10" , "11" };
int n = arr.length;
System.out.println(addBinary(arr, n));
}
}
|
Python3
def addBinaryUtil(a, b):
result = "";
s = 0 ;
i = len (a) - 1 ;
j = len (b) - 1 ;
while (i > = 0 or j > = 0 or s = = 1 ):
s + = ( ord (a[i]) - ord ( '0' )) if (i > = 0 ) else 0 ;
s + = ( ord (b[j]) - ord ( '0' )) if (j > = 0 ) else 0 ;
result = chr (s % 2 + ord ( '0' )) + result;
s / / = 2 ;
i - = 1 ;
j - = 1 ;
return result;
def addBinary(arr, n):
result = "";
for i in range (n):
result = addBinaryUtil(result, arr[i]);
return result;
arr = [ "1" , "10" , "11" ];
n = len (arr);
print (addBinary(arr, n));
|
C#
using System;
class GFG
{
static String addBinaryUtil(String a,
String b)
{
String result = "" ;
int s = 0;
int i = a.Length - 1, j = b.Length - 1;
while (i >= 0 || j >= 0 || s == 1)
{
s += ((i >= 0) ? a[i] - '0' : 0);
s += ((j >= 0) ? b[j] - '0' : 0);
result = s % 2 + result;
s /= 2;
i--;
j--;
}
return result;
}
static String addBinary(String []arr, int n)
{
String result = "" ;
for ( int i = 0; i < n; i++)
{
result = addBinaryUtil(result, arr[i]);
}
return result;
}
public static void Main(String[] args)
{
String []arr = { "1" , "10" , "11" };
int n = arr.Length;
Console.WriteLine(addBinary(arr, n));
}
}
|
Javascript
<script>
function addBinaryUtil(a, b)
{
var result = "" ;
var s = 0;
var i = a.length - 1, j = b.length - 1;
while (i >= 0 || j >= 0 || s == 1) {
s += ((i >= 0) ? a.charCodeAt(i) - '0' .charCodeAt(0) : 0);
s += ((j >= 0) ? b.charCodeAt(j) - '0' .charCodeAt(0) : 0);
result = String.fromCharCode((s % 2 ==1 ?1:0) +
'0' .charCodeAt(0)) + result;
s = parseInt(s/2);
i--;
j--;
}
return result;
}
function addBinary(arr, n)
{
var result = "" ;
for ( var i = 0; i < n; i++)
result = addBinaryUtil(result, arr[i]);
return result;
}
var arr = [ "1" , "10" , "11" ];
var n = arr.length;
document.write( addBinary(arr, n));
</script>
|
PHP
<?php
function addBinaryUtil( $a , $b )
{
$result = "" ;
$s = 0;
$i = strlen ( $a ) - 1;
$j = strlen ( $b ) - 1;
while ( $i >= 0 || $j >= 0 || $s == 1)
{
$s += (( $i >= 0) ? ord( $a [ $i ]) - ord( '0' ) : 0);
$s += (( $j >= 0) ? ord( $b [ $j ]) - ord( '0' ) : 0);
$result = chr ( $s % 2 + ord( '0' )). $result ;
$s =(int)( $s /2);
$i --;
$j --;
}
return $result ;
}
function addBinary( $arr , $n )
{
$result = "" ;
for ( $i = 0; $i < $n ; $i ++)
$result = addBinaryUtil( $result , $arr [ $i ]);
return $result ;
}
$arr = array ( "1" , "10" , "11" );
$n = count ( $arr );
echo addBinary( $arr , $n ). "\n" ;
?>
|
Complexity Analysis:
- Time complexity: O(n)
- Auxiliary Space: O(n)
Approach 2:
By converting the binary strings to decimal numbers.
Here’s a step-by-step explanation of the approach:
- Initialize a variable sum to store the sum of the decimal numbers converted from the binary strings.
- Loop through each binary string in the array:
- Initialize a variable num to store the decimal number converted from the current binary string.
- Loop through each character in the current binary string from right to left:
- If the current character is ‘1’, add 2 raised to the power of its position from right to num.
- Add num to sum.
- Initialize an empty string result to store the binary representation of sum.
- While sum is greater than 0:
- If sum is even, prepend “0” to result, otherwise prepend “1”.
- Divide sum by 2.
- Return result.
C++
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
string addBinary(string arr[], int n)
{
int sum = 0;
for ( int i = 0; i < n; i++)
{
int num = 0;
for ( int j = arr[i].size() - 1; j >= 0; j--)
if (arr[i][j] == '1' )
num += pow (2, arr[i].size() - j - 1);
sum += num;
}
string result = "" ;
while (sum > 0)
{
result = (sum % 2 == 0 ? "0" : "1" ) + result;
sum /= 2;
}
return result;
}
int main()
{
string arr[] = { "1" , "10" , "11" };
int n = sizeof (arr) / sizeof (arr[0]);
cout << addBinary(arr, n) << endl;
return 0;
}
|
Java
import java.io.*;
import java.math.BigInteger;
public class GFG {
static String addBinary(String[] arr) {
BigInteger sum = BigInteger.ZERO;
for (String binaryStr : arr) {
BigInteger num = new BigInteger(binaryStr, 2 );
sum = sum.add(num);
}
return sum.toString( 2 );
}
public static void main(String[] args) {
String[] arr = { "1" , "10" , "11" };
System.out.println(addBinary(arr));
}
}
|
Python3
def addBinary(arr):
sum = 0
for i in range ( len (arr)):
num = 0
for j in range ( len (arr[i]) - 1 , - 1 , - 1 ):
if arr[i][j] = = '1' :
num + = 2 * * ( len (arr[i]) - j - 1 )
sum + = num
result = ''
while sum > 0 :
result = ( '0' if sum % 2 = = 0 else '1' ) + result
sum = sum / / 2
return result
arr = [ '1' , '10' , '11' ]
print (addBinary(arr))
|
C#
using System;
class GFG
{
static string addBinary( string [] arr)
{
int sum = 0;
foreach ( string binNum in arr)
{
int num = 0;
for ( int j = binNum.Length - 1; j >= 0; j--)
{
if (binNum[j] == '1' )
{
num += ( int )Math.Pow(2, binNum.Length - j - 1);
}
}
sum += num;
}
string result = "" ;
while (sum > 0)
{
result = (sum % 2 == 0 ? '0' : '1' ) + result;
sum /= 2;
}
return result;
}
static void Main( string [] args)
{
string [] arr = { "1" , "10" , "11" };
Console.WriteLine(addBinary(arr));
}
}
|
Javascript
function addBinary(arr) {
let sum = 0;
for (let i = 0; i < arr.length; i++) {
let num = 0;
for (let j = arr[i].length - 1; j >= 0; j--) {
if (arr[i][j] === '1' ) {
num += Math.pow(2, arr[i].length - j - 1);
}
}
sum += num;
}
let result = '' ;
while (sum > 0) {
result = (sum % 2 === 0 ? '0' : '1' ) + result;
sum = Math.floor(sum / 2);
}
return result;
}
const arr = [ '1' , '10' , '11' ];
console.log(addBinary(arr));
|
Time Complexity: O(N*K)
Auxiliary Space: O(1)
Explanation:
The time complexity of this approach is O(nk), where n is the number of binary strings and k is the maximum length of a binary string in the array. This is because we need to loop through each binary string and each character in the binary strings.
The auxiliary space complexity of this approach is O(1), as we only use a constant amount of extra space to store variables such as sum, num, and result.