67、二进制求和

问题描述

在这里插入图片描述

问题分析

简单模拟一下二进制相加的过程即可,思路如下:

  1. 两个字符串长度对齐:短的字符串前面补0,直到和长的字符串对齐。
  2. 逐项相加:相加情况只可能是0、1、2、3。
  3. 特殊情况处理:头部若需要进位,那么得在头部额外添加一位。

解法:简单模拟

  • 时间复杂度:O( max(a_length, b_length) ),其中a_length、b_length分别表示两个字符串的长度。

Java代码

package com.company;

public class Main {

    public static void main(String[] args) {
//        String a = "1010";
//        String b = "1011";
        String a = "10";
        String b = "11";
        System.out.println(addBinary(a, b));

    }

    static public String addBinary(String a, String b) {
        int a_length = a.length();
        int b_length = b.length();

        //预处理,对齐
        if (a_length > b_length){
            for (int i = 1; i <= (a_length-b_length); i++) {
                b = "0" + b;
            }
        }else {
            for (int i = 1; i <= (b_length-a_length); i++) {
                a = "0" + a;
            }
        }

        String result = "";
        int ahead = 0;
        //逐位相加
        for (int i = Math.max(a_length, b_length) - 1; i >= 0; i--) {
            int sum = (a.charAt(i) - '0') + (b.charAt(i) - '0') + ahead;

            //结果只能是0、1、2、3
            switch (sum){
                case 0:
                    ahead = 0;
                    result = "0" + result;
                    break;
                case 1:
                    ahead = 0;
                    result = "1" + result;
                    break;
                case 2:
                    ahead = 1;
                    result = "0" + result;
                    //头部特殊情况处理
                    if (i == 0){
                        result = "1" + result;
                    }

                    break;
                case 3:
                    ahead = 1;
                    result = "1" + result;
                    if (i == 0){
                        result = "1" + result;
                    }
                    break;
                default:
                    System.out.println("error");
                    break;
            }
        }
        return result;
    }
}

结果分析

以上代码的执行结果:

执行时间内存消耗
4 ms35.9 MB

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值