Problem: Given two binary strings a and b, return their sum as a binary string.
Example:
Input: a = "11", b = "1" Output: "100"
Input: a = "1010", b = "1011" Output: "10101"
Approach: Nothing much to discuss here. Its an easy problem to solve. Just look at the implementation to understand the approach.
Implementation in C#:
public string AddBinary(string a, string b)
{
int lenA = a.Length;
int lenB = b.Length;
int maxLen = Math.Max(lenA, lenB);
char[] res = new char[maxLen];
int i = lenA - 1, j = lenB - 1;
int k = maxLen - 1;
int carry = 0;
while(i >= 0 && j >= 0)
{
char add = '0';
if (a[i] == '1' && b[j] == '1')
{
add ='0';
if (carry == 1)
{
add = '1';
}
carry = 1;
}
else if (a[i] == '0' && b[j] == '0')
{
add = '0';
if (carry == 1)
{
add = '1';
}
carry = 0;
}
else
{
add = '1';
if (carry == 1)
{
add = '0';
carry = 1;
}
else
{
carry = 0;
}
}
res[k--] = add;
--i;
--j;
}
if (i >= 0)
{
this.HandleSingleNum(a, i, res, k, ref carry);
}
if (j >= 0)
{
this.HandleSingleNum(b, j, res, k, ref carry);
}
string result = carry == 1 ?
"1" + new string(res) :
new string(res);
return result;
}
private void HandleSingleNum(
string num,
int numIndex,
char[] result,
int resIndex,
ref int carry)
{
while(numIndex >= 0)
{
if (num[numIndex] == '0')
{
if (carry == 1)
{
result[resIndex--] = '1';
}
else
{
result[resIndex--] = '0';
}
carry = 0;
}
else
{
if (carry == 1)
{
result[resIndex--] = '0';
carry = 1;
}
else
{
result[resIndex--] = '1';
carry = 0;
}
}
--numIndex;
}
}
Complexity: O(n) where n is max of length of a and length of b.