67. 二进制求和

题目描述

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

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

示例 1:

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

示例 2:

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

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

我的思路

  1. 把两个字符串全部转换成相应的字符数组。

  2. 设置两个指针变量,分别指向两个数组的最后一个元素。

  3. 设置一个字符数组变量,指向上面两个数组长度较长的那个;一个整数,指向那个较长数组的最后一个元素。

  4. 从两个数组尾部依次往前判断计算结果,有无进位,保存当前位的计算结果,直到其中一个数组遍历完。有2种情况:
    4.1 如果没有进位,则返回最终结果。
    4.2 如果还有进位,继续处理那个长度较长的数组,当前位加上进位标志jinwei,如果不再发生进位,先保存当前位结果,再返回最终结果;如果还有进位,则继续往前(高位或索引小的方向)处理,直到不再进位。

  5. 如果处理完较长数组还是有进位,说明最高位发生进位,数组长度需要加一,第一个字符为'1',后面依次复制前面的计算结果即可。最后返回结果。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

我的程序(Java)

class Solution {
    public String addBinary(String a, String b) {
        char[] aCharArray = a.toCharArray(); // 将2个字符串转换成字符数组
        char[] bCharArray = b.toCharArray(); 
        int jinwei = 0; // 进位标志位
        int aIndex = aCharArray.length - 1; // 初始化两个字符数组的末尾索引
        int bIndex = bCharArray.length - 1;
        char[] res;
        int resIndex;
        if(a.length() >= b.length()){// res指向长度较大的字符数组,resIndex为对应数组的最后一个索引
            res = aCharArray;
            resIndex = aIndex;
        }else{
            res = bCharArray;
            resIndex = bIndex;
        }
        while(aIndex >= 0 && bIndex >= 0){
            int sum = (aCharArray[aIndex] - '0') + (bCharArray[bIndex] - '0') + jinwei;
            if(sum > 1){    // 可能为2或者3
                jinwei = 1;
                res[resIndex] = (char)(sum % 2 + '0');
            }else{
                res[resIndex] = (char)(sum + '0');
                jinwei = 0; // 后面还是有可能发生进位,不能直接返回结果
            }
            resIndex--;
            aIndex--;
            bIndex--;
        }
        if(jinwei == 0) // 没有进位,则返回结果
            return new String(res);
        while(resIndex >= 0){   // 当有一个位数比较多,将这个数组剩下的字符处理完
            int sum = res[resIndex] - '0' + jinwei;
            if(sum > 1){
                jinwei = 1;
                res[resIndex] = (char)(sum % 2 + '0');
            }else{
                res[resIndex] = (char)(sum + '0');
                return new String(res); // 这边因为只处理一个数组,如果此次没有进位,下次也不可能进位
            }
            resIndex--;
        }   //当这个数组全部处理完,还没有返回结果,说明还有进位,数组长度要比原来长的那个还要加一
        char[] lres = new char[res.length + 1]; // 数组长度加一
        lres[0] = '1';  // 第一个字符肯定时'1'
        for(int i = 1; i < lres.length; i++){
            lres[i] = res[i-1]; // 后面依次复制原来的结果
        }
        return new String(lres);
    }
}

其他方法,可参考灵魂画师牧码
如有不当之处,欢迎读者批评指正!

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值