剑指Offer II 002. 二进制加法

这篇博客探讨了如何实现两个二进制数的加法,主要涉及位运算和字符串处理。作者分析了核心逻辑,包括位操作、进位处理以及不同长度字符串的加法,并提供了测试用例,包括简单的和复杂的例子。测试用例着重于字符串索引、类型转换和StringBuilder的append方法。代码实现中,作者给出了两个版本,第二版优化了进位处理,提高了效率。
摘要由CSDN通过智能技术生成

0. 题目描述

剑指 Offer II 002. 二进制加法
在这里插入图片描述

2. 题目分析

  1. 核心逻辑:位运算,带进位相加
    涉及的关键点:
    ① 位操作,字符串转化为 char 类型
    ② 进位,每次位运算后的进位,最后一次进位
    ③ 字符串长度不一致
  2. 是否考虑溢出:
    104 也即 1024 ,数值范围小于 216 ,个人认为不用考虑

3. 测试用例分析

  1. 简单例子
    在这里插入图片描述
    补充注意点:
    ① 关于String 索引 index 范围的测试
    ② 关于 StringBuffer 中 append(int i) 参数类型测试
    ③ 关于 StringBuffer 中 append(int i) 追加字符串位置的验证
public static void main(String[] args) {
        String a = "hello";
        System.out.println(a.length());
        System.out.println(a.charAt(a.length() - 1));
        StringBuffer sb = new StringBuffer("a");
        sb.append(1);
        System.out.println(sb);
    }

结论:
① String字符串 索引范围 [0, str.length() - 1]
② 参数类型可以直接是int类型不用转化
③ append()方法在原有字符串后面追加内容

    @Override
    public synchronized StringBuffer append(float f) {
        toStringCache = null;
        super.append(f);
        return this;
    }

    @Override
    public synchronized StringBuffer append(double d) {
        toStringCache = null;
        super.append(d);
        return this;
    }

结论:
① StringBuilder 类中重载了基本数据类型和引用数据类型的append()方法
② 基本数据类型:boolean,char,byte,int,short,long,float,double
③ 引用数据类型:Object,String
④ 类类型:StringBuilder,AbstractStringBuilder(抽象类)
2. 复杂例子
在这里插入图片描述

4. 代码

版本①:超出时间限制

public String addBinary0(String a, String b) {
    int i = a.length() - 1, j = b.length() - 1, cr = 0;
    StringBuilder sb = new StringBuilder();
    while(i >= 0 || j >= 0 || cr > 0){
        int aa = i >= 0 ? a.charAt(i--) - '0' : 0;
        int bb = j >= 0 ? b.charAt(j--) - '0' : 0;
        cr = aa + bb + cr;
        sb.append(cr % 2);
        cr = cr / 2;
    }
    return sb.reverse().toString();
}

版本②:改进版本①合并中间变量(处理后的字符串的位)

public String addBinary(String a, String b){
    int len = Math.max(a.length(), b.length());
    StringBuilder sb = new StringBuilder();
    int cr = 0;
    for(int i = 0; i < len; i++){
        cr += i < a.length() ? a.charAt(a.length() - 1 - i) - '0' : 0;
        cr += i < b.length() ? b.charAt(b.length() - 1 - i) - '0' : 0;
        sb.append(cr % 2);
        cr /= 2;
    }
    sb = cr > 0 ? sb.append(cr) : sb;
    return sb.reverse().toString();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值