龙空技术网

每日一题:二进制求和

Virigo 23

前言:

此刻各位老铁们对“二进制加法算法例题”大约比较关切,同学们都需要知道一些“二进制加法算法例题”的相关知识。那么小编同时在网络上汇集了一些关于“二进制加法算法例题””的相关文章,希望大家能喜欢,我们快快来了解一下吧!

地址

leetcode地址:

难度

简单

题目

给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。

示例 1:

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

输出:"100"

示例 2:

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

输出:"10101"

提示:

1 <= a.length, b.length <= 10^4a 和 b 仅由字符 '0' 或 '1' 组成字符串如果不是 "0" ,就不含前导零思路

第一个思路就是使用Java自带的API进行。

class Solution {    public String addBinary(String a, String b) {        return Integer.toBinaryString(Integer.parseInt(a, 2) + Integer.parseInt(b, 2));    }}

写完之后,发现问题。题目中a和b长度最大值为10^4。远远超过了int的数值范围,故不可使用上述的方法。

先回顾下我们十进制加法方式:

首先两个「加数」的右端对齐。

然后从最右侧开始,依次计算对应的两位数字的和。如果和大于等于 10,则把和的个位数字计入结果,并向前面进位。

依次向左计算对应位置两位数字的和,如果有进位需要加上进位。如果和大于等于 10,仍然把和的个位数字计入结果,并向前面进位。

当两个「加数」的每个位置都计算完成,如果最后仍有进位,需要把进位数字保留到计算结果中。

那么二进制加法的计算也可以采用类似的方法。但与十进制不同的是,二进制的进位规则是「逢二进一」,即当求和结果 >=2 时,需要向前进位。

class Solution {    public String addBinary(String a, String b) {        StringBuilder res = new StringBuilder();        int i = a.length() - 1;        int j = b.length() - 1;        int carry = 0;        // a 没遍历完,或 b 没遍历完,或进位不为 0        while (i >= 0 || j >= 0 || carry != 0) {            // 当前 a 的取值            int disA = i >= 0 ? a.charAt(i) - '0' : 0;            // 当前 b 的取值            int disB = j >= 0 ? b.charAt(j) - '0' : 0;            int sum  = disA + disB + carry;            // 是否有进位            carry = sum>=2 ? 1 : 0;            // 去除进位后留下的数字            sum  = sum>=2 ? sum-2 : sum;            // 把去除进位后留下的数字拼接到结果中            res.append(sum);            i--;            j--;        }        // 把结果反转并返回        return res.reverse().toString();    }}

标签: #二进制加法算法例题