剑指 Offer II 002. 二进制加法

本文讲解如何使用StringBuilder高效地实现两个二进制字符串的相加,避免整型溢出问题。讨论了字符串操作和StringBuilder的性能优化,以及与String、StringBuffer的区别。
摘要由CSDN通过智能技术生成

创建时间: November 23, 2021 3:07 PM
最后编辑时间: November 23, 2021 3:42 PM
标签: 位运算, 字符串, 数学
状态: 已完成
网址: https://leetcode-cn.com/problems/JFETK5/
难度: 简单

题目

输入两个表示二进制的字符串,请计算它们的和,并以二进制字符串的形式输出。例如,输入的二进制字符串分别是"11"和"10",则输出"101"。

分析

这里不能将字符串转换成整型进行计算,因为字符串长度是无限的,转成int或者long都可能会溢出,因此还是得使用字符串进行计算。右端对齐,逢二进一

String,StringBuilder和StringBuffer之间的区别

  1. String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,这样不仅效率低下,而且大量浪费有限的内存空间,所以经常改变内容的字符串最好不要用 String
  2. StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。
  3. StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。
  4. 由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类。

代码

class Solution {
    public String addBinary(String a, String b) {
        int aIndex=a.length()-1;
        int bIndex=b.length()-1;
        StringBuilder sb=new StringBuilder();
        //两个加数
        int aa,bb;
        //进位
        int c=0;
        //每位上的和
        int sum=0;
        while(aIndex>=0 || bIndex>=0){
            if(aIndex>=0)aa=a.charAt(aIndex--)-'0';
            else aa=0;
            if(bIndex>=0)bb=b.charAt(bIndex--)-'0';
            else bb=0;
            sum=aa+bb+c;
            if(sum>1){
                sum-=2;
                c=1;
            }
            else{
                c=0;
            }
            sb.append(sum);
        }
        if(c==1)sb.append(c);
        return sb.reverse().toString();
    }
}

上述代码思路是对的,但是代码有些繁琐了,if...else...语句可以用三目运算符:? 替换,以下是书中给的解法

class Solution {
    public String addBinary(String a, String b) {
        StringBuilder result=new StringBuilder();
        int i=a.length()-1;
        int j=b.length()-1;
        int carry=0;//进位
        while(i>=0 || j>=0){
            int digitA=i>=0?a.charAt(i--)-'0':0;
            int digitB=j>=0?b.charAt(j--)-'0':0;
            int sum=digitA+digitB+carry;
            carry=sum>=2?1:0;
            sum=sum>=2?sum-2:sum;
            result.append(sum);
        }
        if(carry==1){
            result.append(1);
        }
        return result.reverse().toString();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值