67. 二进制求和(Java)
2019-08-16 本文已影响0人
软萌白甜Hedy
题目
给定两个二进制字符串,返回他们的和(用二进制表示)。
输入为非空字符串且只包含数字 1 和 0。
示例 1:
输入: a = "11", b = "1"
输出: "100"
示例 2:
输入: a = "1010", b = "1011"
输出: "10101"
解题过程:
我将每一步的思路都注释在代码上,所以不做其他解释:
public String addBinaryOwn(String a, String b){
// 1.先保证两个字符串不为空;
if(a==null||a.length()==0){
return b;
}
if(b==null||b.length()==0){
return a;
}
// 2.在两个字符串不为空的前提下,像十进制加法一样,从个位开始,也就是二进制的从低位到高位的顺序,
// 设置两个字符串的最低位标记索引;
int i = a.length()-1;
int j = b.length()-1;
// 3.设置进位为0;
int c =0;
// 4.用一个stringbuilder来放计算当前位置和结果的字符串;
StringBuilder res = new StringBuilder();
//5.从最低位开始循环,因为ab的长度可能不一致,必须有索引不能为负数的前提,还要考虑到最高位只剩一个进位的情况;
while(i>=0||j>=0||c==1){
if(i>=0){
//6.进位跟a当前位置的字符相加;
c+= a.charAt(i)-'0';
}
if(j>=0){
//7.进位跟b当前位置的字符相加;
c+= b.charAt(j)-'0';
}
//8.此时c可能的情况有三种:0(不进位,当前位置和为0),1(不进位,当前位置和为1),2(进位1,当前位置和为0),
// 3(进位1,当前位置和为1);
//9.以此看来,当前位置的和可以看成add/2的余数,进位是add右移一位之后的值;
res.append(c%2);
c>>=1;
//10.ab的索引各-1,向左挪一位。
i--;
j--;
}
return res.reverse().toString();
}
结果
执行用时 :5 ms, 在所有 Java 提交中击败了80.25%的用户
内存消耗 :36.1 MB, 在所有 Java 提交中击败了55.25%的用户