leetcode-67-二进制求和

问题:

 

 

package com.example.demo;

public class Test67 {

    /**
     * 二进制求和
     * 思路:
     * 1、先获取两个二进制字符串的长度,用于补齐为等长字符串,便于两两相加
     * 2、定义一个overFlow来表名两两相加是否已经满足进1
     * 3、定义循环,总字符串的最后开始计算(也就是低位开始计算)
     * 4、将overFlow+ a1 + b1 - 0   --->这个值代表运算出的结果
     * 5、将运算出的结果和‘1‘ 和 ’3‘ 比较(因为二进制相加只有四种情况,这两种情况是需要进位的)
     * '0' + '0'  -->  '0'
     * '1' + '0'  -->  '1'
     * '1' + '1'  -->  '2'
     * '1' + '1' + overFlow  -->  '3'
     * 6、使用stringbuffer保存每一次运算后的结果
     * 7、循环完成之后,需要判断最后一次运算是否满足进位,满足的话,需要单独处理
     * 8、最后reverse翻转字符串即为结果
     */
    public String addBinary(String a, String b) {
        StringBuffer sb = new StringBuffer();
        int len1 = a.length();
        int len2 = b.length();

        // 向将两个字符串补齐
        while (len1 < len2) {
            a = '0' + a;
            len1++;
        }

        while (len2 < len1) {
            b = '0' + b;
            len2++;
        }


        int overFlow = 0;
        int index = a.length() - 1;
        // 从低位两两相加,并计算最终的二进制值,append到stringbuffer中
        while (index >= 0) {
            char c = a.charAt(index);
            char c1 = b.charAt(index);
            int sum = c + c1 - '0' + overFlow;
            if (sum >= '2') {
                overFlow = 1;
            } else {
                overFlow = 0;
            }
            sb.append((sum == '1' || sum == '3') ? '1' : '0');
            index--;
        }
        // 循环完成之后,需要判断最后一次运算是否满足进位,满足的话,需要单独处理
        if (overFlow == 1) {
            sb.append('1');
        }
        return sb.reverse().toString();
    }

    public static void main(String[] args) {

        Test67 t = new Test67();
        String s = t.addBinary("11", "");
        System.out.println(s);
    }
}

 

posted @ 2019-08-13 17:57  xj-record  阅读(219)  评论(0编辑  收藏  举报