剑指 Offer II 002. 二进制加法(简单 数学 字符串 模拟)

剑指 Offer II 002. 二进制加法

给定两个 01 字符串 a 和 b ,请计算它们的和,并以二进制字符串的形式输出。

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

示例 1:

输入: a = “11”, b = “10”
输出: “101”
示例 2:

输入: a = “1010”, b = “1011”
输出: “10101”

提示:

每个字符串仅由字符 ‘0’ 或 ‘1’ 组成。
1 <= a.length, b.length <= 10^4
字符串如果不是 “0” ,就都不含前导零。

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

分析

该题思路跟力扣的第二题类似,参考之前写的题解:https://blog.csdn.net/weixin_43942435/article/details/122812280

题解(Java)

class Solution {
    public String addBinary(String a, String b) {
        //创建一个字符串
        StringBuilder sb = new StringBuilder();
        int m = a.length(), n = b.length();
        //创建四个变量分别是记录进位、记录字符串a当前索引的值、记录字符串a当前索引的值、记录前面的和
        int cnt = 0, num1 = 0, num2 = 0, num = 0;
        while (m > 0 || n > 0) {
            if (m > 0) {
                //利用ASCII码的计算将字符转变为int类型
                num1 = a.charAt(m - 1) - 48;
                m--;
            }
            if (n > 0) {
                num2 = b.charAt(n - 1) - 48;
                n--;
            }
            num = num1 + num2 + cnt;
            //判断是否有进位,同时调整num的值
            if (num >= 2) {
                num -= 2;
                cnt = 1;
            } else {
                cnt = 0;
            }
            sb.append(num);
            if (m == 0 && n == 0 && cnt == 1) sb.append(1);
            num1 = 0;
            num2 = 0;
        }
        //需注意要翻转,因为是从后向前计算、连接的
        return sb.reverse().toString();
    }
}

版权声明:本文为weixin_43942435原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。