67 二进制求和(模拟)

1. 问题描述:

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

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

示例 1:

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

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-binary

2. 思路分析:

① 题目很好理解,我们需要求解的是两个字符串在二进制求和下的结果是什么,比较容易想到的是使用模拟的方法来解决,从字符串的末尾开始遍历两个字符串,当两个字符串的长度是一样的情况下才执行循环,循环结束之后假如字符串的长度不为0那么处理剩余的字符串即可,从字符串最末尾的字符开始,对字符进行相加的操作,在模拟数字相加的时候需要使用变量来记录上一次进位的情况,其中可以分为三种情况:

1)存在进位,并且当前的两个字符都是1的情况,例如11 + 11,两个字符串的高位的都是1并且存在来自于低位的进位,高位当前的计算结果为1

2)存在进位,当前的两个字符不全是1的情况,例如11 + 01,高位当前计算结果为0

3)没有进位的情况

我们在计算出当前字符的计算结果之后需要对应这三种情况来更新进位的变量这样在下一次的时候才好加上进位

② 循环中最多处理到两个字符串长度较短的加法的情况,所以可能存在有的字符串比较长,所以我们需要处理剩余的字符串,这个时候需要考虑最后一次的进位的情况,使用循环将最后一次的进位加到下一个字符中,然后把剩余的字符相加之和加入到结果集中,并且得到最后需要判断是否还有进位因为等到字符串的长度为零之后那么有可能还存在进位这个时候将结果添加上进位的1即可

③ 假如两个字符串长度相同那么只需要考虑最后的进位即可

④ 因为可能存在一个字符串剩余的情况,所以可以使用一个方法来处理分别对应两种字符串不同的情况

⑤ 在写代码的时候可能某些细节没有考虑到,所以在提交的时候结合错误的时候使用idea的debug进行调试那么很快就可以找到错误,提高效率,最好不要使用java中的api来解决因为可能会发生某些异常的情况

3. 代码如下:

import java.util.Scanner;
public class Solution {
    public String addBinary(String a, String b) {
        StringBuffer res = new StringBuffer("");
        /*思路是遍历字符串模拟加法操作*/
        int aPos = a.length() - 1;
        int bPos = b.length() - 1;
        /*进位标志*/
        int isTwo = 0;
        while (aPos >= 0 && bPos >= 0){
            int aNum = a.charAt(aPos) - '0';
            int bNum = b.charAt(bPos) - '0';
            /*是否进位了, 使用if判断当前上是否进位了*/
            if (isTwo + aNum + bNum == 2){
                isTwo = 1;
                //表示进位了
                res.append('0');
            }else if (isTwo + aNum + bNum == 3){
                //表示进位了
                isTwo = 1;
                res.append('1');
            }else {
                /*相加为0或者是1的情况*/
                res.append(isTwo + aNum + bNum);
                isTwo = 0;
            }
            /*字符串往前移动一位*/
            aPos--;
            bPos--;
        }
        /*可能剩余还有字符串存在着三种情况分别是a字符串还有剩余, b字符串还有剩余, 都没有剩余*/
        if (aPos >= 0){
            return solve(res, aPos, a, isTwo);
        }else if (bPos >= 0){
            return solve(res, bPos, b, isTwo);
        }
        if (isTwo == 1) return res.append('1').reverse().toString();
        return res.reverse().toString();
    }

    private String solve(StringBuffer res, int pos, String s, int isTwo) {
        /*字符串有剩余*/
        while (pos >= 0){
            if (isTwo + (s.charAt(pos) - '0') == 2){
                res.append('0');
                isTwo = 1;
            }else {
                res.append(isTwo + (s.charAt(pos) - '0'));
                isTwo = 0;
            }
            --pos;
        }
        if (isTwo == 1) res.append('1');
        return res.reverse().toString();
    }
}
发布了569 篇原创文章 · 获赞 153 · 访问量 59万+

猜你喜欢

转载自blog.csdn.net/qq_39445165/article/details/105276525