LeetCode67. 二进制求和

给定两个二进制字符串,返回他们的和(用二进制表示)。

输入为非空字符串且只包含数字 1 和 0

示例 1:

输入: a = "11", b = "1"
输出: "100"

示例 2:

输入: a = "1010", b = "1011"
输出: "10101"

class Solution {
    public String addBinary(String a, String b) {
        if(a==null||b==null){
            return "";
        }
        int a1[]=stringFormatInteger(a);
    	int b1[]=stringFormatInteger(b);//将字符串转换成数组
    	a1=reversal(a1);
    	b1=reversal(b1);
    	int c[]=addArrayAB(a1,b1);
        	c=reversal(c);
    	String s=integerFormatString(c);
    	return s;
    }
     public static int[] addArrayAB(int[] a,int[] b) {
    	int lenA=a.length,lenB=b.length;
    	int shortLen,longLen;
    	int i,j;
    	int[] a1=a;
    	int[] b1=b;
    	if(lenA>lenB) {
    		shortLen=lenB;
    		longLen=lenA;
    		int c[]=new int[longLen+1];
    		for(i=0;i<longLen;i++) {
    			c[i]=a1[i];
    		}
    		c[i]=0;
    		for(i=0;i<shortLen;i++) {
        		c[i]+=b1[i];
        		if(c[i]>=2) {
        			c[i]%=2;
        			c[i+1]+=1;
        		}
        	}
    		for(j=i;j<longLen;j++) {
    			if(c[j]>=2) {
        			c[j]%=2;
        			c[j+1]+=1;
        		}
    		}
    		if(c[longLen]==0) {
    			int d[]=new int[longLen];
    			for(i=0;i<longLen;i++) {
    				d[i]=c[i];
    			}
    			return d;
    		}
    		return c;
    	}else if(lenA<lenB) {
    		shortLen=lenA;
    		longLen=lenB;
    		int c[]=new int[longLen+1];
    		for(i=0;i<longLen;i++) {
    			c[i]=b1[i];
    		}
    		c[i]=0;
    		for(i=0;i<shortLen;i++) {
        		c[i]+=a1[i];
        		if(c[i]>=2) {
        			c[i]%=2;
        			c[i+1]+=1;
        		}
        	}
    		for(j=i;j<longLen;j++) {
    			if(c[j]>=2) {
        			c[j]%=2;
        			c[j+1]+=1;
        		}
    		}
    		if(c[longLen]==0) {
    			int d[]=new int[longLen];
    			for(i=0;i<longLen;i++) {
    				d[i]=c[i];
    			}
    			return d;
    		}
    		return c;
    	}else {
    		longLen=lenB;
    		int c[]=new int[longLen+1];
    		for(i=0;i<longLen;i++) {
    			c[i]=a1[i];
    		}
    		c[i]=0;
    		for(i=0;i<longLen;i++) {
        		c[i]+=b1[i];
        		if(c[i]>=2) {
        			c[i]%=2;
        			c[i+1]+=1;
        		}
        	}
    		if(c[longLen]==0) {
    			reversalArray(c);
    			int d[]=new int[longLen];
    			for(i=0;i<longLen;i++) {
    				d[i]=c[i];
    			}
    			return d;
    		}
    		return c;
    	}
    }
    public static boolean reversalArray(int[] a) {
    	int i,j;
    	int len=a.length;
    	int temp=0;
    	for(i=0,j=len-1;i<(len/2+1);i++,j--) {
    		 temp=a[i];
    		a[i]=a[j];
    		a[j]=temp;
    	}
    	return true;
    }
    public static int[] reversal(int[] a) {
    	int b[]=new int[a.length];
    	int i,j;
    	for(i=0,j=a.length-1;i<a.length;i++,j--) {
    		b[i]=a[j];
    	}
    	return b;
    }
    public static int[] stringFormatInteger(String s) {
    	int len=s.length();
    	int[] a=new int[len];
    	for(int i=0;i<len;i++) {
    		a[i]=s.charAt(i)-'0';
    	}
    	return a;
    }
    public static String integerFormatString(int[] a) {
    	
    	int len=a.length;
    	char[] ch=new char[len];
    	for(int i=0;i<len;i++) {
    		switch(a[i]) {
    		case 0:
    			ch[i]='0';break;
    		case 1:
    			ch[i]='1';break;
    		case 2:
    			ch[i]='2';break;
    		case 3:
    			ch[i]='3';break;
    		case 4:
    			ch[i]='4';break;
    		case 5:
    			ch[i]='5';break;
    		case 6:
    			ch[i]='6';break;
    		case 7:
    			ch[i]='7';break;
    		case 8:
    			ch[i]='8';break;
    		case 9:
    			ch[i]='9';break;
    			default:break;
    		}
    	}
    	String str=new String(ch);
    	return str;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值