• 二进制求和(力扣第67题)


    题目:

    给你两个二进制字符串,返回它们的和(用二进制表示)。

    输入为非空字符串且只包含数字 1 和 0

    示例1:

    输入: a = "11", b = "1"
    输出: "100"

    示例2:

    输入: a = "1010", b = "1011"
    输出: "10101"

    分析:

    其实就是两个二进制数的加法运算,两个二进制数相加,首先设置一个进位标识符flag,初始值设置0。从低位到高位开始相加:

      1、对应位置相加,然后再加上flag,三者之和设置为temp_sum,然后结果值的当前位为temp_sum%2,flag = temp_sum/2

      2、进行遍历二进制字符串的时候,因为需要从低位开始运算,而二进制数的低位之于字符串对应的位置,是字符串的索引高位,所以解决方法就有两个:

        (1)设置两个游标变量,初始值为a、b两个字符串的长度减去1,然后开始遍历,没完成一次,游标变量就自减运算一次

        (2)将两个二进制数字符串逆置一下,然后索引低位就和二进制低位对应上了,最后再将结果倒置一下就可以了

      3、遍历进行的条件是,a的游标变量的值要在0-a.length这个范围内 或者  b的游标变量的值要在0-b.length这个范围内 或者 flag==1

    实现代码1:

    public String addBinary(String a, String b) {
            StringBuilder sa = new StringBuilder(a).reverse();
            StringBuilder sb = new StringBuilder(b).reverse();
            StringBuilder sc = new StringBuilder();
            int i = 0;
            int flag = 0;
            while (i < sa.length() && i < sb.length()){
                if (sa.charAt(i) == '1' && sb.charAt(i) == '1'){
                    if (flag == 0){
                        sc.append(0);
                    }else {
                        sc.append(1);
                    }
                    flag = 1;
                }else if (sa.charAt(i) == '1' || sb.charAt(i) == '1'){
    
                    if (flag == 1){
                        sc.append(0);
                        flag = 1;
                    }else {
                        sc.append(1);
                    }
    
                }else {
                    if (flag == 1){
                        sc.append(1);
                    }else {
                        sc.append(0);
                    }
                    flag = 0;
                }
                i++;
            }
            while (i < sa.length()){
                if (flag == 1){
                   if (sa.charAt(i) == '1'){
                       sc.append(0);
                       flag = 1;
                   }else {
                       sc.append(1);
                       flag = 0;
                   }
                }else{
                    if (sa.charAt(i) == '1'){
                        sc.append(1);
                    }else {
                        sc.append(0);
                    }
                }
                i++;
            }
    
            while (i < sb.length()){
                if (flag == 1){
                    if (sb.charAt(i) == '1'){
                        sc.append(0);
                        flag = 1;
                    }else {
                        sc.append(1);
                        flag = 0;
                    }
                }else{
                    if (sb.charAt(i) == '1'){
                        sc.append(1);
                    }else {
                        sc.append(0);
                    }
                }
                i++;
            }
            if (flag == 1){
                sc.append(1);
            }
    
            return sc.reverse().toString();
        } 

    可以优化一下,上面的代码太麻烦了:

    public String addBinary(String a, String b) {
        int i = a.length() - 1, j = b.length() - 1, carry = 0;
        StringBuilder str = new StringBuilder();
        while (carry == 1 || i >= 0 || j >= 0) {
            if (i >= 0 && a.charAt(i--) == '1') {
                carry++;
            }
            if (j >= 0 && b.charAt(j--) == '1') {
                carry++;
            }
            str.append(carry % 2);
            carry /= 2;
        }
        return str.reverse().toString();
     }

    这段代码参考自大神CyC2018。

  • 相关阅读:
    MySql性能调优三(explain/desc执行计划)
    MySql性能调优二(BTree、B+Tree与索引数据结构)
    MySql性能调优一(存储引擎InnoDB,MyISAM)
    PHP 数组底层实现原理
    哈希算法及其应用场景
    散列表、散列函数和散列冲突
    PHP中的XML解析的5种方法
    特殊的线性表:递归
    Navicat12破解教程(Navicat_Keygen_Patch_By_DFoX V5.6)
    svn服务端安装、迁移教程、Eclipse切换svn连接库
  • 原文地址:https://www.cnblogs.com/yxym2016/p/13042791.html
Copyright © 2020-2023  润新知