(算法练习)二进制求和

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/add-binary

主要考察的知识点:


1.当前字符的 ASCII 值减去 ‘0’ 的 ASCII 值,相当于将这个字符转换成数值

2.StringBuilder 与 StringBuffer 的区别

3.字符翻转的方法 reverse();

4.时间复杂度的计算

实现思路:

整体思路是将两个字符串较短的用 00 补齐,使得两个字符串长度一致,然后从末尾进行遍历计算,得到最终结果。

本题解中大致思路与上述一致,但由于字符串操作原因,不确定最后的结果是否会多出一位进位,所以会有 2 种处理方式:

第一种,在进行计算时直接拼接字符串,会得到一个反向字符,需要最后再进行翻转

第二种,按照位置给结果字符赋值,最后如果有进位,则在前方进行字符串拼接添加进位

方案一:相关代码 (ps  由于Asscii 的知识点是盲点,我也是一句句敲的,一边写一边理解思路,加上备注)


class Solution {

    public String addBinary(String a, String b) {

        int aLen = a.length();

        int bLen = b.length();

        int maxLen = Math.max(aLen,bLen);

        

        //字符串进行翻转

        StringBuilder sbA = new StringBuilder(a).reverse();

        StringBuilder sbB = new StringBuilder(b).reverse();

        

        //让两个字符串补齐成一个长度,翻转过后前置位补0

        while(sbA.length() < maxLen){

            sbA.append("0");

        }

        

        while(sbB.length() < maxLen){

            sbB.append("0");

        }

    

        StringBuilder res = new StringBuilder();

        

        //进位的标志位, 默认是0

        int carry = 0;

        

        //知识点:当前字符的 ASCII 值减去 '0' 的 ASCII 值,相当于将这个字符转换成数值

        int num1;

        int num2;

        

        for(int i=0; i < maxLen; i++){

            num1 = sbA.charAt(i) - '0';    

            num2 = sbB.charAt(i) - '0';

            

            if(carry + num1 + num2 > 1){

                //1+1的情况,在二进制下 需要减去2

                res.append(carry + num1 + num2 - 2);

                

                //表示 需要进位,改变标志位

                carry = 1;

            }else{

               res.append(carry + num1 + num2);

               carry = 0; 

            }

        }

        

        //对于最高位 需要增加位数,如果存在进位的情况

        if(carry == 1){

            res.append("1");

        }

        

        //最后再翻转一次,为开始补位的时候就是翻转后的

        return res.reverse().toString();

        

    }

    

}

方案二:相关代码 (ps  我也是一句句敲的,一边写一边理解思路,加上备注)

上面的代码“翻转”了两次,显得有点啰嗦,我们可以使用两个指针,分别从字符串的末尾开始向前遍历,同时在借用 StringBuilder 对象的 insert 方法,从右向左依次得出计算结果,就真的非常接近我们手写“竖式加法”的过程了。下面是参考代码(摘录自题解)


    private String doAddWithInsert(String a, String b){

        int i = a.length() - 1;

        int j = b.length() - 1;

        

        //这个是结果: 可变的字符序列对象

        StringBuilder res = new StringBuilder();


# 文末

很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从那里入手去学习,对此我整理了一些资料,需要的可以免费分享给大家

这里笔者分享一份自己收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司2021年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。

![](https://img-blog.csdnimg.cn/img_convert/51962c5b59bf27e699f20d2c6ba82eac.webp?x-oss-process=image/format,png)

![](https://img-blog.csdnimg.cn/img_convert/7df40ca340f388aef9f80a167c87184c.webp?x-oss-process=image/format,png)

【视频教程】

![](https://img-blog.csdnimg.cn/img_convert/b76c23239fedcb05334c7a68636842fd.webp?x-oss-process=image/format,png)

天道酬勤,只要你想,大厂offer并不是遥不可及!希望本篇文章能为你带来帮助,如果有问题,请在评论区留言。


示一部分。

[外链图片转存中...(img-8fnJsF49-1719292242767)]

[外链图片转存中...(img-BLmjzGVQ-1719292242767)]

【视频教程】

[外链图片转存中...(img-RXfZKZai-1719292242768)]

天道酬勤,只要你想,大厂offer并不是遥不可及!希望本篇文章能为你带来帮助,如果有问题,请在评论区留言。


  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值