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类型。

下面给出代码

  

 

   

 

   

 

   

 

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

posted @ 2021-05-16 22:33  瑜琦  阅读(113)  评论(0)    收藏  举报