【刷题日记】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. 二进制求和
今天就到这里,学习所得,若有偏差,还请斧正
欢迎点赞,关注,收藏
朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力
好了,本次就到这里
技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。
我是阿兵云原生,欢迎点赞关注收藏,下次见~