【刷题日记】67. 二进制求和

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

【刷题日记】67. 二进制求和

本次刷题日记的第 15 篇,力扣题为:67. 二进制求和简单

一、题目描述:

晚上锻炼一波身体后,继续看看题,这个题,题目很清晰,描述很短,看上去也是简单题,这个妥妥的是个简单题,咱们来换换脑袋

互相自信 - 不知道哪来的自信 _自信_斗图表情

但是我们也不能掉以轻心,还是要仔细的来分析这个题给出的重点内容和考查的点

二、思路分析:

1、这道题考察了什么思想?你的思路是什么?

题目中给出的信息有这些重点信息:

  • 给出的二进制数,都是字符串,咱们返回的也是需要是字符串
  • 字符串中的数字只有 0 和 1 ,且给出的字符串中是不含前导 0 的,且数组的长度范围是 1 到 10 的 4 次方,所以针对刷这道题不用考虑输入异常的情况

查看我们的示例:a = "1010", b = "1011"

看这个例子,**a 数组的长度和 b 数组的长度是一致的,**且中间涉及进位,最高位也涉及进位

下面这个例子,也要注意 a 数组的长度小于 b 数组的长度,或者 b 数组的长度小于 a 数组的长度,默认 上面是 a 数组,下面是 b 数组

总得来说需要考虑这几个点:

  • len(a) == len(b)
  • len(a) < len(b)
  • len(a) > len(b)
  • 进位的处理

三、编码

根据上述逻辑和分析,我们就可以翻译成如下代码

编码如下:

func addBinary(a string, b string) string {
    lenA,lenB := len(a),len(b)
    n := 0
    if lenA > lenB {
        n = lenA
    }else{
        n = lenB
    }

    res := ""
    jinwei := 0
    // 使用较长数组的长度来控制循环
    for i:=0; i<n; i++ {
        // 对应位数 a 数组上有值,那就进行相加
        if i<lenA {
            jinwei += int(a[lenA-i-1] - '0')
        }
        // 对应位数 b 数组上有值,那就进行相加
        if i<lenB {
            jinwei += int(b[lenB-i-1] - '0')
        }
        // a 数组和 b 数组对应位置上相加后,需要填在该位置的值 
        res = strconv.Itoa(jinwei % 2) + res
        // 需要向前进位的数据
        jinwei = jinwei / 2
    }

    // 判断最后是否需要进位
    if jinwei > 0{
        res = "1" + res
    }

    return res
}
复制代码

看了如上编码之后可以发现,完全是按照编码前的思考和分析的情况来进行编码落地的

以小见大咱们编码之前确实是需要将方案设计清晰可落地,针对每一个细节和盲区都要逐个击破,这样才能做到降低编码后的风险

四、总结:

本题时间复杂度很明显是 O(n) ,n 是较长数组的长度,空间复杂度是 O(1) 引入了常数级别的内存消耗

原题地址:67. 二进制求和

今天就到这里,学习所得,若有偏差,还请斧正

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是小魔童哪吒,欢迎点赞关注收藏,下次见~

猜你喜欢

转载自juejin.im/post/7079773017902956558