Add Binary | leetcode 67 【Java解题报告】

原题链接:67. Add Binary

【思路1】

思路1和思路3思路是一样的,也是用0补齐最短字符串左侧,至两字符串等长,如 a = "1111", b = "1",其基本实现就是实现 a = "1111",b = "0001",这样相加,只是代码更简洁:

    public String addBinary(String a, String b) {
        int maxLen = Math.max(a.length(), b.length());
        StringBuilder sb = new StringBuilder();
        int carry = 0;
        for (int i = 0; i < maxLen; i++) { //从右边开始逐位取出字符串 a、b 的字符值 tempA 和 tempB,如果长度不足,则用0替代
            int tempA = a.length() > i ? a.charAt(a.length() - i - 1) - '0' : 0;
            int tempB = b.length() > i ? b.charAt(b.length() - i - 1) - '0' : 0;
            sb.insert(0, (tempA + tempB + carry) % 2);  //在最左侧插入相加结果
            carry = tempA + tempB + carry > 1 ? 1 : 0;  //得到进位
        }
        if (carry == 1) sb.insert(0, 1);  //如果最高位有进位,则最高位还要加一位 1
        return sb.toString();
    }

294 / 294 test cases passed. Runtime: 5 ms  Your runtime beats 30.64% of javasubmissions.

【思路2】:

先将两个字符串逐位从右到左相加的和与进位相加,放入字符数组中。最后等到短的字符串加完之后,留下较长的为加完毕字符串和进位,用以补充字符数组。当然这种解法比较麻烦:

public class Solution {
    public static String addBinary(String a, String b) {
        if(a.equals("")) return b;
        if(b.equals("")) return a;               //如果b为空,则返回a
        int al = a.length() - 1;                 //字符串a的长度减1,刚好指向数组的末尾
        int bl = b.length() - 1;  
        int t = Math.max(al, bl) + 1;    
        char[] arr = new char[t+1];             //设置要创建char数组的长度
        int c = 0;
        /*char[] str1 = a.toCharArray();
        char[] str2 = b.toCharArray();*/  //注释部分是将字符串放入数组中,这种方法以后再实现,如果读者有兴趣的话,可以自己尝试实现。
        for(; al>=0 && bl>=0; al--, bl--, t--) {           //这里实现a1与b1的位相加
            int s = a.charAt(al) + b.charAt(bl) + c - '0' - '0';
            if(s==2) {
            	c = 1;
            	s = 0;
            } else if(s == 3) {
            	c = 1;
            	s = 1;
            }
            else c = 0;
            arr[t] = (char)(s+'0');
        }
        while (al >= 0) {                      //若b字符串长度小于a长度,则继续求 a 和进位的和
        	if(a.charAt(al) - '0' + c > 1) {
        		arr[t] = 0 + '0';
        		c = 1;
        	} else {
        		arr[t] = (char) (a.charAt(al) + c);
        		c = 0;
        	}
            t--;
            al--;
        }
        while (bl >= 0) {
        	if(b.charAt(bl) - '0' + c > 1) {
        		arr[t] = 0 + '0';
        		c = 1;
        	} else {
        		arr[t] = (char) (b.charAt(bl) + c);
        		c = 0;
        	}
            t--;
            bl--;
        }
        if(c == 1) arr[0] = 1+'0';
        //将数组转化为字符串输出
        return new String(arr).trim();
    }
}

294 / 294 test cases passed. Runtime: 3 ms  Your runtime beats 91.41% of javasubmissions.

【思路3】:

麻烦之处在于字符串有长短之分,如果不控制好,可能会造成空指针异常。那么我们可以将最短的字符串右端用0补齐,这时两个字符串就等长了,这样就可以逐位相加,最后还有判断是否有进位,如果有进位还得在最左端补上一位1:

public class Solution {
    public String addBinary(String a, String b) {
		int aLen = a.length();
		int bLen = b.length();
		if(aLen > bLen) {                    //字符串 b 的长度较长
			int gap = aLen - bLen;
			while(gap-- > 0) b = 0 + b;  //用0补齐字符串 b 至字符串 a、b 等长
		}
		if(bLen > aLen) {
			int gap = bLen - aLen;
			while(gap-- > 0) a = 0 + a;
		}
		int maxLen = aLen > bLen ? aLen : bLen;
		int c = 0, sum = 0;
		String result = "";
		for(int i = --maxLen; i >= 0; i--) {
			sum = a.charAt(i) + b.charAt(i) + c - '0' * 2;
			if(sum > 1) {
				c = 1;
				sum -= 2;
			} else {
				c = 0;
			}
			result = sum + result;
		}
		if(c == 1) result = 1 + result;
		return result;
	}
}

294 / 294 test cases passed.   Runtime: 5 ms


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值