【LeetCode力扣题库】67. 二进制求和(简单)

原题目链接:67. 二进制求和


题目描述:

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

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

示例 1:

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

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

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

做题思路:

  1. 整体思路是将两个字符串较短的用 0 补齐,使得两个字符串长度一致,然后从末尾进行遍历计算,得到最终结果
  2. 但是有一个问题,出现了求和之后,字符串多了一个字符,例如 11 和 1 二进制相加,变成了 100 ,那么对于这种情况,我是采用反转来进行处理

废话不多说,直接上代码,为了让各位看官更能清晰理解,我的代码写得不精简,我的代码里加了大量的注释,相信各位看官可以理解,如果我有些没写清楚或者写错的,可以评论区或者私信我喔

public String addBinary(String a, String b) {
        //用于字符串拼接
        StringBuilder ans = new StringBuilder();
        //判断是否出现二进制
        int he = 0;
        //开始遍历两个字符串,从最后一个字符开始遍历
        for(int i = a.length() - 1, j = b.length() - 1;i >= 0 || j >= 0; i--,j--){ 
            //用于下次循环是否出现二进制
            int sum = he;
            // 获取字符串a对应的某一位的值 当i<0是 sum+=0(向前补0) 否则取原值 ‘1’的char类型和‘0’的char类型刚好相差为1
            //这里是利用了char类型的ASCII值
            //如果这里不-'0',那sum加的值就变成了ASCII值,可能是48,也可能是49
            sum += (i >= 0 ? a.charAt(i) - '0' : 0);
            // 获取字符串b对应的某一位的值 当j<0是 sum+=0(向前补0) 否则取原值 ‘1’的char类型和‘0’的char类型刚好相差为1
            sum += (j >= 0 ? b.charAt(j) - '0' : 0);
            //开始拼接
            //如果两个数都是1,则拼接的是0,因为是二进制
            ans.append(sum % 2);
            //如果两个数都是1,则要向前进1,那么下次循环的时候he就把这个1加进去
            he = sum / 2;
        }
        //循环结束,可能出现多一位的情况,所以要进行判断
        ans.append(he == 1 ? he : "");
        //反转,这里要反转是因为字符串拼接是从后面开始的
        //例如100和1,变成101+"",反转后,还是101
        //例如11和1,变成001,反转后,变成100
        //这就是反转的意思所在
        //并且变成String类,因为题目要求返回String类
        return ans.reverse().toString();
    }

猜你喜欢

转载自blog.csdn.net/qq_45798556/article/details/113888856