leetcode每日一题(2021.5.16)——二进制求和(问题已解决)
题目:二进制求和
一、问题描述
给你两个二进制字符串,返回它们的和(用二进制表示)。
输入为 非空 字符串且只包含数字 1 和 0。
示例 1:
输入: a = "11", b = "1"
输出: "100"
示例 2:
输入: a = "1010", b = "1011"
输出: "10101"
提示:
每个字符串仅由字符 '0' 或 '1' 组成。
1 <= a.length, b.length <= 10^4
字符串如果不是 "0" ,就都不含前导零。
二、解答过程
这道题看上去又需要用到逆序遍历的思想了,可以尝试用两个指针分别指向两个字符串,如果两个指针都为0就继续向前,出现0和1就修改一个指针指向的值,出现1和1,就改成0并将下一位改成1。
显然只有三种情况,那么可以提取字符转换成int以后求和,和为0就是两个0,和为1就是一个0一个1,和为2就是两个1。但是由于java中char类型对int类型的转换需要先转换成string类型然后再转换成int类型这样操作过于麻烦,所以我还是想直接比较试试。还有一个问题是java中的string是不可变的,所以不能直接修改(需要转成StringBuffer),不如新建一个字符串用于返回。
还有一个问题,如果用字符串来模拟二进制进位,需要对当前遍历元素的下一个元素进行操作,而且在对后面的元素操作时有种种麻烦。所以我决定直接把二进制求和做成整型加和的形式。
其实这种方法很简单,二进制的0+0等同于十进制0+0;二进制的0+1等同于十进制的0+2^j,这里j是二进制的阶数,等同于10^j;二进制的1+1等同于2^j+2^j;
所以定义一个整型来实现二进制加和更方便操作,最后只需要把整型在转换成二进制的字符串就行了。
三、代码


这就是最终代码,但是这个代码有缺陷,当超出int范围时会计算出错;该代码优化在日后完成。
四、对于溢出的解决
在参考过leetcode的官方答案后,我明白了用可以用一个进位技术器实现进位操作,这样既不需要转换成int类型,也可以完成进位的操作。进位计数器为0则表示无进位,为1则表示有进位,当然可以用布尔类型实现,但我为了直观选择了int类型。
下面给出代码




代码写了很长一段,当然你可以去参考官方答案中的代码,官方给出的代码更简短。但我为了便于自己以后的理解没有采用官方的代码。

浙公网安备 33010602011771号