让我们一起啃算法----二进制求和

二进制求和(Add-Binary)

题干:

给你两个二进制字符串,返回它们的和(用二进制表示)。
输入为 非空 字符串且只包含数字 1 和 0。
示例 1:
  输入: a = “11”, b = “1”
  输出: “100”
示例 2:
  输入: a = “1010”, b = “1011”
  输出: “10101”
提示:
每个字符串仅由字符 ‘0’ 或 ‘1’ 组成。
1 <= a.length, b.length <= 10^4
字符串如果不是 “0” ,就都不含前导零。
来源:力扣

解题思路与 让我们一起啃算法—-两数相加 相似,只不过这里将链表换成了字符串,并且 进位条件由大于等于 10 产生进位变成了 大于等于 2 产生进位

解题思路

首先要明确,一个 数字字符 与 字符0 相减,得到的值就是这个数字字符的数值,即 ‘9’ - ‘0’ 等于 9

初始化 i 指向字符串 a 的最后一个字符,j 指向字符串 b 的最后一个字符,res 为空字符串,接着计算得到 数值 a[i] 与 数值 b[j] 的和,记为 sum

如果 sum 等于 2,则产生进位 carry,且进位值为 1,如果 sum 小于 2,则不产生进位,carry 设置为 0。并将 sum % 2 的值转成字符串记为 v,与 res 进行拼接,由于我们是从右往左遍历的,每次计算得到的 v 应该与 res 左拼接,即 res = v + res

接着 i 向左移动一位,b 向左移动一位,继续计算数值 a[i] 与 数值 b[j] 的和,记得求和时带上上次的进位值,重复上面的操作。

大致思路如上,详细流程,可以查看下面的流程图:

代码实现

GO语言实现


func addBinary(a string, b string) string {
    var res string
    var carry uint8
    i := len(a) - 1
    j := len(b) - 1

    // i 或者 j 有一个越界了就跳出循环,即表示 字符串a 与字符串b 长度不一致
    for i >= 0 && j >= 0 {
        // 计算 sum ,strconv.Itoa 将数值转成对应的字符串
        res = strconv.Itoa(int((a[i] - '0' + (b[j] - '0') + carry) % 2)) + res

        // 计算进位
        carry = ((a[i] - '0') + (b[j] - '0') + carry) / 2
        i --
        j --
    }

    // j越界
    for i >= 0 {
        // 字符串a 剩余的字符与进位求和
        res = strconv.Itoa(int((a[i] - '0'  + carry) % 2)) + res
        carry = ((a[i] - '0') + carry) / 2
        i --
    }

    // i 越界
    for j >= 0 {
        // 字符串b 剩余的字符与进位求和
        res = strconv.Itoa(int((b[j] - '0' + carry) % 2)) + res
        carry = ((b[j] - '0') + carry) / 2
        j --
    }

    // i 和 j 都越界了,判断 carry进位是否大于0,如果大于0,这需要将这个最高位补上
    if carry > 0 {
        res = "1" + res
    }
    return  res
}

总结

每天进步一点点,加油!
算法教程项目,每天更新一题,点个 star 支持一下呀
https://github.com/wx-satellite/learning-a…

本作品采用《CC 协议》,转载必须注明作者和本文链接
三斤
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 2
function addBinary($a, $b) {
        $i = strlen($a) - 1; //a的长度
        $j = strlen($b) - 1; //b的长度
        $ca = 0;//商
        $ans = '';//结果
        for (;$i >= 0 || $j >= 0; $i--, $j--) {
            $sum = $ca;
            $sum += $i >= 0 ? $a[$i] - '0' : 0;
            $sum += $j >= 0 ? $b[$j] - '0' : 0;
            //sum和上次的余数和本次的a,b对应的位置相加
            //余数为当前位置
            $ans .= (int)($sum % 2);
            //商为进位
            $ca = (int)($sum / 2);
        }
        //如果ca=1表示最后有进位
        $ans .= $ca == 1 ? $ca : "";

        //用php的形式,将字符串转数组,然后再反转,最后数组转字符串
        return implode("", array_reverse(str_split($ans)));
    }
3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!