剑指Offer【二进制加法】

二进制加法

题目描述:给定两个 01 字符串 a 和 b ,请计算它们的和,并以二进制字符串的形式输出。输入为 非空 字符串且只包含数字 1 和 0。

看到题目描述之后,第一反应就是按照日常十进制加法来模拟二进制加法,也就没有多想,直接暴力计算。

解法

由于是二进制加法,只涉及 0 和 ;同时也和十进制加法一样,需要进位标志。为了方便计算,用0补齐a或b,使a b长度相等。话不多说,直接上代码。

	public static String addBinary(String a, String b) {
        int aLength = a.length(), bLength = b.length();
        StringBuilder stringBuilder = new StringBuilder();
        // 用0补齐a或b,使a b长度相等
        if (aLength > bLength) {
            stringBuilder.append("0".repeat(aLength - bLength));
            b = stringBuilder.append(b).toString();
        } else {
            stringBuilder.append("0".repeat(bLength - aLength));
            a = stringBuilder.append(a).toString();
        }
        char[] aChars = a.toCharArray();
        char[] bChars = b.toCharArray();
        int[] cChars = new int[aChars.length];
        int jin = 0;
        for (int i = aChars.length - 1; i >= 0; i--) {
            // 这里需要注意char 和 int 换算
            int sum = (aChars[i] == '0' ? 0 : 1) + (bChars[i] == '0' ? 0 : 1) + jin;
            jin = sum >= 2 ? 1 : 0;
            // 这里直接采用模运算获取
            cChars[i] = sum % 2;
        }
        StringBuilder builder = new StringBuilder();
        for (int item : cChars){
            builder.append(item);
        }
        String result = builder.toString();
        StringBuilder builder1 = new StringBuilder();
        // 如果最后的进位是1 ,则高位需要补1
        if(jin == 1){
            result = builder1.append(1).append(result).toString();
        }
        return result;
    }

上述代码就是按照十进制加法的思路来实现二进制加法,但是比较繁琐,对上述代码稍加改进。优化之后代码如下:

	public static String addBinary(String a, String b) {
        int aLength = a.length(), bLength = b.length();
        StringBuilder stringBuilder = new StringBuilder();
        // 用0补齐a或b,使a b长度相等
        if (aLength > bLength) {
            stringBuilder.append("0".repeat(aLength - bLength));
            b = stringBuilder.append(b).toString();
        } else {
            stringBuilder.append("0".repeat(bLength - aLength));
            a = stringBuilder.append(a).toString();
        }
        StringBuilder sb = new StringBuilder();
        int jin = 0;
        for (int i = a.length() - 1; i >= 0; i--) {
            // 这里需要注意char 和 int 换算
            int sum = (a.charAt(i) == '0' ? 0 : 1) + (b.charAt(i) == '0' ? 0 : 1) + jin;
            jin = sum / 2;
            // 这里直接采用模运算获取
            sb.append(sum % 2);
        }
        // 如果最后的进位是1 ,则高位需要补1
        if (jin == 1) {
            sb.append(jin);
        }
        return sb.reverse().toString();
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值