Given two binary strings, return their sum (also a binary string).
For example,
a = “11”
b = “1”
Return “100”.
Summary:
Array[i] is faster than String.charAt(int i);
Method 1 : (4ms)
public class Solution {
public String addBinary(String a, String b) {
int indexa = a.length() - 1;
int indexb = b.length() - 1;
char[] result = new char[indexa > indexb ? indexa+2 : indexb+2];
int index = result.length-1;
byte[] arr1 = a.getBytes();
byte[] arr2 = b.getBytes();
byte carry = 48;
while(indexa >= 0 && indexb >= 0){
if((arr1[indexa] ^arr2[indexb]) != 0){
if(carry != 48){
result[index--] = '0';
}else{
result[index--] = '1';
}
}else{
if(carry != 48 ){
result[index--] = '1';
if(a.charAt(indexa) == '0'){
carry = 48;
}
}else{
result[index--] = '0';
if(a.charAt(indexa) == '1'){
carry = 49;
}
}
}
indexa--;
indexb--;
}
while(indexa >= 0){
if((arr1[indexa] ^ carry) != 0){
result[index--] = '1';
carry = 48;
}else{
result[index--] = '0';
}
indexa--;
}
while(indexb >= 0){
if((arr2[indexb] ^ carry) != 0){
result[index--] = '1';
carry = 48;
}else{
result[index--] = '0';
}
indexb--;
}
if(carry != 48){
result[index--] = '1';
}
return String.valueOf(result).trim();
}
}
Method 2:(6ms)
public class Solution {
public String addBinary(String a, String b) {
int indexa = a.length() - 1;
int indexb = b.length() - 1;
byte[] arr1 = a.getBytes();
byte[] arr2 = b.getBytes();
StringBuffer sb = new StringBuffer();
int carry = 48;
while(indexa >= 0 && indexb >= 0){
if((arr1[indexa] ^arr2[indexb]) != 0){
if(carry != 48){
sb.insert(0, "0");
}else{
sb.insert(0, "1");
}
}else{
if(carry != 48 ){
sb.insert(0, "1");
if(a.charAt(indexa) == '0'){
carry = 48;
}
}else{
sb.insert(0, "0");
if(a.charAt(indexa) == '1'){
carry = 49;
}
}
}
indexa--;
indexb--;
}
while(indexa >= 0){
if((arr1[indexa] ^ carry) != 0){
sb.insert(0, "1");
carry = 48;
}else{
sb.insert(0, "0");
}
indexa--;
}
while(indexb >= 0){
if((arr2[indexb] ^ carry) != 0){
sb.insert(0, "1");
carry = 48;
}else{
sb.insert(0, "0");
}
indexb--;
}
if(carry != 48){
sb.insert(0, "1");
}
return sb.toString();
}
}
Method 3:(9ms)
public class Solution {
public String addBinary(String a, String b) {
int indexa = a.length() - 1;
int indexb = b.length() - 1;
StringBuffer sb = new StringBuffer();
int carry = 0;
while(indexa >= 0 && indexb >= 0){
if((Integer.parseInt(a.charAt(indexa)+"") ^ Integer.parseInt(b.charAt(indexb)+"")) != 0){
if(carry != 0){
sb.insert(0, "0");
}else{
sb.insert(0, "1");
}
}else{
if(carry != 0 ){
sb.insert(0, "1");
if(a.charAt(indexa) == '0'){
carry = 0;
}
}else{
sb.insert(0, "0");
if(a.charAt(indexa) == '1'){
carry = 1;
}
}
}
indexa--;
indexb--;
}
while(indexa >= 0){
if((Integer.parseInt(a.charAt(indexa)+"") ^ carry) != 0){
sb.insert(0, "1");
carry = 0;
}else{
sb.insert(0, "0");
}
indexa--;
}
while(indexb >= 0){
if((Integer.parseInt(b.charAt(indexb)+"") ^ carry) != 0){
sb.insert(0, "1");
carry = 0;
}else{
sb.insert(0, "0");
}
indexb--;
}
if(carry != 0){
sb.insert(0, "1");
}
return sb.toString();
}
}