题目要求
输入: a = “1010”, b = “1011”
输出: “10101”
提示:
每个字符串仅由字符 ‘0’ 或 ‘1’ 组成。
1 <= a.length, b.length <= 10^4
字符串如果不是 “0” ,就都不含前导零。
Related Topics 数学 字符串
解题思路
1.(取出两个数字组中最小长度的值)从尾数开始相加,加到这个位置为止
2.如果两个位置相同,判断是否要进位,有的话,多加一位
3.当不需要进位的时候,返回的数值是两个数组中较长多余的数字部分+之前运算的结果
4.如果需要进位,则继续按照剩余部分于进位相加减
代码如下
class Solution {
public static String addBinary(String a, String b) {
int alen=a.length();
int blen=b.length();
int maxlen=Math.max(alen,blen);
int minlen=Math.min(alen,blen);
StringBuilder sb=new StringBuilder();
int flag=0;
for(int i=minlen-1;i>=0;i--)
{
int sum=a.charAt(--alen)-'0'+b.charAt(--blen)-'0'+flag;
if(sum==0)
{
sb.append(0);
flag=0;
}
if(sum==1)
{
sb.append(1);
flag=0;
}
if(sum==2)
{
sb.append(0);
flag=1;
}
if(sum==3)
{
sb.append(1);
flag=1;
}
}
if(maxlen==minlen&&flag==1)
{
sb.append(1);
return sb.reverse().toString();
}
if(flag==0)
{
String res=sb.reverse().toString();
if(a.length()>b.length())
res=a.substring(0,maxlen-minlen)+res;
else
res=b.substring(0,maxlen-minlen)+res;
return res;
}
if(a.length()>b.length())
{
for(int i=maxlen-minlen-1;i>=0;i--)
{
if(a.charAt(i)-'0'==1&&a.charAt(i)-'0'==flag)
{
sb.append(0);
flag=1;
}
else {
sb.append(a.charAt(i)-'0'+flag);
flag=0;
}
}
if(flag==1)
sb.append(1);
}
else{
for(int i=maxlen-minlen-1;i>=0;i--)
{
if(b.charAt(i)-'0'==1&&b.charAt(i)-'0'==flag)
{
sb.append(0);
flag=1;
}
else {
sb.append(b.charAt(i)-'0'+flag);
flag=0;
}
}
if(flag==1)
sb.append(1);
}
return sb.reverse().toString();
}
}
效果:
info
解答成功:
执行耗时:3 ms,击败了57.90% 的Java用户
内存消耗:37.6 MB,击败了50.43% 的Java用户
补充
解题第四步可以优化
继续通过后位于进位运算,遇到0的时候停下判别