【LeetCode】67. 二进制求和(Java)

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

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

解法一

class Solution {
    public String addBinary(String a, String b) {
        //转为二进制int后相加,然后toBinaryString输出二进制String
        // return Integer.toBinaryString(Integer.parseInt(a, 2) + Integer.parseInt(b, 2));
        //结果被一大串字符串撑爆了

        //使用双指针
        char[] ch1 = a.toCharArray();
        char[] ch2 = b.toCharArray();
        StringBuilder result = new StringBuilder();

        int i1 = ch1.length - 1;
        int i2 = ch2.length - 1;
        //carry代表进位
        int carry = 0;

        while (i1 >= 0 && i2 >= 0) {
            //双1
            if (ch1[i1] == '1' && ch2[i2] == '1') {
                result.insert(0, carry);
                //双1一定会进位
                carry = 1;
            }
            //双0
            else if (ch1[i1] == '0' && ch2[i2] == '0') {
                result.insert(0, carry);
                //双1一定不会进位
                carry = 0;
            }
            //单1
            else {
                if (carry == 1) {
                    //carry不改变,继续进位
                    result.insert(0, 0);
                } else {
                    result.insert(0, 1);
                }
            }
            i1--;
            i2--;
        }

        //ch1还没完
        while (i1 >= 0) {
            if (ch1[i1] == '1' && carry == 1) {
                result.insert(0, 0);
                carry = 1;
            } else {
                result.insert(0, ch1[i1] == '0' && carry == 0 ? 0 : 1);
                carry = 0;
            }
            i1--;
        }
        //ch2还没完
        while (i2 >= 0) {
            if (ch2[i2] == '1' && carry == 1) {
                result.insert(0, 0);
                carry = 1;
            } else {
                result.insert(0, ch2[i2] == '0' && carry == 0 ? 0 : 1);
                carry = 0;
            }
            i2--;
        }

        //如果都循环完后,还有进位
        if (carry == 1) {
            result.insert(0, 1);
        }

        return result.toString();
    }
}

在这里插入图片描述
本来以为挺简单的,结果越写越多-_-||,看了题解。

解法二

解法二是画手大鹏发布的题解,下面注解是评论区tomcat-yf写的,写得很好,我直接复制过来了。
这种写法的思路:也是使用双指针,从后往前依次相加,如果其中一个长度为0,而另一个还没结束,那么就在结束那个上加0,一直到两个长度都为0,我没想到可以补0这茬,以后长短不一的可以补位,降低了编码的难度,学习了。

class Solution {
    public String addBinary(String a, String b) {
        StringBuilder ans = new StringBuilder();
        int ca = 0; //是否进一位
        for (int i = a.length() - 1, j = b.length() - 1; i >= 0 || j >= 0; i--, j--) {
            int sum = ca;
            sum += (i >= 0 ? a.charAt(i) - '0' : 0); // 获取字符串a对应的某一位的值 当i<0是 sum+=0(向前补0) 否则取原值 ‘1’的char类型和‘0’的char类型刚好相差为1
            sum += (j >= 0 ? b.charAt(j) - '0' : 0);// 获取字符串a对应的某一位的值 当i<0是 sum+=0(向前补0) 否则取原值 ‘1’的char类型和‘0’的char类型刚好相差为1
            ans.append(sum % 2);    //如果二者都为1 那么sum%2 应该刚好为0 否则为1
            ca = sum / 2;            //如果二者都为1 那么ca 应该刚好为1 否则为0
        }
        ans.append(ca == 1 ? ca : "");// 判断最后一次计算是否有进位  有则在最前面加上1 否则原样输出
        return ans.reverse().toString();
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值