67. 二进制求和

题目:

思路:

【1】其实都是需要考虑超出最大长度的字符串长度的情况

代码展示:

//时间1 ms 击败 99.81%
//内存40.5 MB 击败 36.73%
//将数据划分为三种情况进行处理
class Solution {
    public String addBinary(String a, String b) {
        int an = a.length() , bn = b.length() ;
        int index = 0, carryBit = 0, value = 0,n = Math.max(an,bn);
        int[] res = new int[n+1];
        char[] ac = a.toCharArray() , bc =b.toCharArray();
        // 将两字符公共部分进行相加进位
        while (index < an && index < bn){
            value = (ac[an - 1 - index] - '0')+(bc[bn - 1 - index] - '0')+carryBit;
            carryBit = value / 2;
            res[n - index++] = value % 2;
        }
        // 如果a 比 b 长的情况
        while (index < an){
            value = (ac[an - 1 - index] - '0')+carryBit;
            res[n - index++] = value % 2;
            carryBit = value / 2;
        }
        // 如果a 比 b 短的情况
        while (index < bn){
            value = (bc[bn - 1 - index] - '0')+carryBit;
            res[n - index++] = value % 2;
            carryBit = value / 2;
        }
        // 如果a 与 b 一样长的情况且存在溢出现象
        if (carryBit == 1){
            res[n - index] = 1;
        }
        StringBuffer buf = new StringBuffer();
        for (int i = 0; i < res.length ; i++){
            // 对于字符串前面的0进行去除
            if (res[i] == 0 && buf.length() == 0 && i < res.length - 1) continue;
            buf.append(res[i]);
        }
        return buf.toString();
    }   
}

//时间2 ms 击败 31.88%
//内存40.1 MB 击败 86.18%
class Solution {
    public String addBinary(String a, String b) {
        // 确保 a 的长度永远大于或等于b
        if(a.length() < b.length()){
            return addBinary(b, a);
        }
        // n 表示结果数组的长度,采用最大长度的an + 1来防止溢出
        int an = a.length() , bn = b.length() , n = an + 1 ;
        int[] res = new int[n];
        int av = 0, bv = 0, carryBit = 0, value = 0;
        for (int i = 0; i < res.length; i++){
            // 字符超出长度部分用0替代,完成整个结果集的计算
            av = (an - 1 - i) >= 0 ? a.charAt(an - 1 - i) - '0' : 0;
            bv = (bn - 1 - i) >= 0 ? b.charAt(bn - 1 - i) - '0': 0;
            value = av + bv + carryBit;
            res[n - 1 - i] = value % 2;
            carryBit = value / 2;
        }
        // 将int结果集转为字符串
        StringBuffer buf = new StringBuffer();
        for (int i = 0; i < res.length ; i++){
            // 对于字符串前面的0进行去除
            if (res[i] == 0 && buf.length() == 0 && i < res.length - 1) continue;
            buf.append(res[i]);
        }
        return buf.toString();
    }   
}

 

posted @ 2023-06-29 12:14  忧愁的chafry  阅读(10)  评论(0)    收藏  举报