LeetCode 67.二进制求和

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

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

示例 1:

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

示例 2:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-binary
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


思路:

思考二进制加法运算中所有可能出现的情形,以a、b和进位carry为例:

abcarry结果
0000
1001
0101
0011
11010(2)
10110(2)
01110(2)
11111(3)

可以发现按照a+b+carry的结果可以分为四类:

当a+b+carry=0的时候,这一位相加只需要在最终结果的字符串上加(append)0,

当a+b+carry=1的时候,只需要在最终结果的字符串上加(append)1,

当a+b+carry=2的时候,需要在最终结果的字符串上加(append)0,因为产生了进位,所以将carry置为1,

当a+b+carry=3的时候,需要在最终结果的字符串上加(append)1,因为产生进位,还需将carry置为1。

另外,加法运算的顺序是从右至左,所以最后产生的结果还需要进行反转(reverse),还需注意的情况是最高位产生进位字符串长度增加了一位。


代码:

class Solution {
    public String addBinary(String a, String b) {
                //将两个字符串长度补齐,短的字符串高位补0,方便计算
		if(a.length()-b.length()>0){
			StringBuffer sb = new StringBuffer();
			for(int i = 0;i < a.length()-b.length() ;i++){
				sb .append('0');
			}
            sb.append(b);
			b=sb.toString();
		}else if(b.length()-a.length()>0){
			StringBuffer sb = new StringBuffer();
			for(int i = 0;i < b.length()-a.length() ;i++){
				sb .append('0');
			}
			sb.append(a);
			a=sb.toString();
		}
                //二进制加法逻辑
		int carry = 0;
		StringBuffer results = new StringBuffer();
		for(int i = a.length()-1 ;i>=0;i--){
			if(Integer.parseInt(String.valueOf(a.charAt(i)))+
			   Integer.parseInt(String.valueOf(b.charAt(i)))+
			   carry == 3){
				results.append('1');
				carry = 1;
			}else if(Integer.parseInt(String.valueOf(a.charAt(i)))+
					 Integer.parseInt(String.valueOf(b.charAt(i)))+
					 carry == 2){
				results.append('0');
				carry = 1;
			}else if(Integer.parseInt(String.valueOf(a.charAt(i)))+
					 Integer.parseInt(String.valueOf(b.charAt(i)))+
					 carry == 1){
				results.append('1');
				carry = 0;
			}else{
				results.append('0');
			}
				
		}
		if(carry==1){ //如果遍历完整个字符串后,carry位是1,说明发生了最高位进位的情况
			results.append('1');  //在最高位补1
		}
		return results.reverse().toString(); //反转结果 并转为String类型
    }
}

这个代码写出来我自己都觉得又臭又长,运算时间只打败了14%的java提交答案,还可以进行大量的优化,但我觉得这个最容易看懂。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值