二进制求和(java编写)

题目要求

输入: 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的时候停下判别

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值