剑指offer 二进制加法Java

题目链接
在代码中需要注意的有:
本题给出的二进制数字是字符串形式,不可以转化成 int 型,因为可能溢出;
两个「加数」的字符串长度可能不同;
在最后,如果进位 carry 不为 0,那么最后需要计算进位;
向结果字符串 res 拼接的顺序是向后拼接,返回时需要把 res 反转 。
代码中的巧妙之处:
while (i >= 0 || j >= 0 || carry != 0)含义:
字符串 a 和 b 只要有一个没遍历完,那么就继续遍历;
如果字符串 a 和 b 都遍历完了,但是最后留下的进位 carry != 0,那么需要把进位也保留到结果中。
取 digit 的时候,如果字符串 a 和 b 中有一个已经遍历完了(即 i <= 0i<=0 或者 j <= 0j<=0),则认为 a 和 b 的对应位置是 00 。

class Solution {
    public String addBinary(String a, String b) {
        StringBuilder res = new StringBuilder(); // 返回结果
        int i = a.length() - 1; // 标记遍历到 a 的位置
        int j = b.length() - 1; // 标记遍历到 b 的位置
        int carry = 0; // 进位
        while (i >= 0 || j >= 0 || carry != 0) { // a 没遍历完,或 b 没遍历完,或进位不为 0
            int digitA = i >= 0 ? a.charAt(i) - '0' : 0; // 当前 a 的取值
            int digitB = j >= 0 ? b.charAt(j) - '0' : 0; // 当前 b 的取值
            int sum = digitA + digitB + carry; // 当前位置相加的结果
            carry = sum >= 2 ? 1 : 0; // 是否有进位
            sum = sum >= 2 ? sum - 2 : sum; // 去除进位后留下的数字
            res.append(sum); // 把去除进位后留下的数字拼接到结果中
            i --;  // 遍历到 a 的位置向左移动
            j --;  // 遍历到 b 的位置向左移动
        }
        return res.reverse().toString(); // 把结果反转并返回
    }
}
posted @   蹇爱黄  阅读(28)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
点击右上角即可分享
微信分享提示