【LeetCode】67. Add Binary(简单难度)

在这里插入图片描述

解法一

直接按位相加

class Solution {
    public String addBinary(String a, String b) {
        StringBuilder ans = new StringBuilder();
        int i = a.length() - 1;
        int j = b.length() - 1;
        int carry = 0;
        while(i >= 0 || j >= 0){
            int num1 = i >= 0 ? a.charAt(i) - 48 : 0;
            int num2 = j >= 0 ? b.charAt(j) - 48 : 0;
            int sum = num1 + num2 + carry;
            carry = 0;
            if(sum >= 2){
                sum = sum % 2;
                carry = 1;
            }
            ans.insert(0,sum);
            i--;
            j--;
        }
        if(carry == 1){
            ans.insert(0,1);
        }
        return ans.toString();
    }
}

在这里插入图片描述

StringBulider是一个可变的字符串类,可以把它看作是一个容器。
String和StringBuilder的区别:
1、String中的内容是不可变的
2、StringBuilder中的内容是可变的
String和StringBuilder的相互转换:
1、通过toString()方法,把StringBuilder转换成String
2、通过StringBuilder的构造方法,把String转换成StringBuilder

使用StringBuilder的方法:
append():添加数据
reverse():反转数据

时间复杂度:O(max(m,n)) ,m 和 n 分别是字符串 a 和 b 的长度。
空间复杂度:O(1)。

解法二(改进)

class Solution {
    public String addBinary(String a, String b) {
        StringBuilder ans = new StringBuilder();
        int i = a.length() - 1;
        int j = b.length() - 1;
        int carry = 0;
        while(i >= 0 || j >= 0){
            int num1 = i >= 0 ? a.charAt(i) - 48 : 0;
            int num2 = j >= 0 ? b.charAt(j) - 48 : 0;
            int sum = num1 + num2 + carry;
            carry = 0;
            if(sum >= 2){
                sum = sum % 2;
                carry = 1;
            }
            ans.append(sum);
            i--;
            j--;
        }
        if(carry == 1){
            ans.append(1);
        }
        return ans.reverse().toString();
    }
}

在这里插入图片描述
因为 String.charAt(0) 代表的是数字的最高位,而我们计算是从最低位开始的,也就是 lenght - 1 开始的,所以在之前的算法中每次得到一个结果我们用的是 ans.insert(0, sum),在 0 位置插入新的数。我猜测是这里耗费了很多时间,因为插入的话,会导致数组的后移。

如果把 insert 换成 append,然后在最后的结果中再倒置,就会快一些了。

如果提前申请空间来存储 sum,直接根据下标赋值,省去了倒置的时间。

解法三(改进)

class Solution {
    public String addBinary(String a, String b) {
        char[] charsA = a.toCharArray(), charsB = b.toCharArray();       
        char[] sum = new char[Math.max(a.length(), b.length()) + 1];    
        int carry = 0, index = sum.length - 1;    
        for (int i = charsA.length - 1, j = charsB.length - 1; i >= 0 || j >= 0; i--, j--){        
            int aNum = i < 0 ? 0 : charsA[i] - '0';        
            int bNum  = j < 0 ? 0 : charsB[j] - '0';
            int s = aNum + bNum + carry;        
            sum[index--] = (char) (s % 2 + '0');        
            carry = s / 2;    
        }    
        sum[index] = (char) ('0' + carry);    
        return carry == 0 ? new String(sum, 1, sum.length - 1) : new String(sum); 
    }    
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玳宸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值