• 67. 二进制求和


    题目描述: 给定两个二进制字符串,返回他们的和(用二进制表示)。
    输入为非空字符串且只包含数字 1 和 0。
    示例 1:
    输入: a = "11", b = "1"
    输出: "100"
    示例 2:
    输入: a = "1010", b = "1011"
    输出: "10101"

    和66题类似,利用carry变量记录加1位

    //C
    
    //这里需要注意字符串数组默认最后一位应该为,分配内存的时候应该加1并手动添加结束符
    
    #define max(a, b) ((a) > (b) ? (a) : (b))
    
    char * addBinary(char * a, char * b){
    	int lena = strlen(a), lenb = strlen(b), carry = 0, tmp = 0;
    	int len = max(lena, lenb), i = lena - 1, j = lenb - 1;
    	int idx = len - 1;
    	char *p = (char *)malloc(sizeof(char)* (len + 1));
    	p[len] = '';
    	while (i >= 0 || j >= 0){
    		if (i >= 0 && j >= 0)
    			tmp = (a[i] - '0') + (b[j] - '0') + carry;
    		else if (i >= 0)
    			tmp = (a[i] - '0') + carry;
    		else
    			tmp = (b[j] - '0') + carry;
    
    		if (tmp == 2) {
    			p[idx--] = '0';
    			carry = 1;
    		}
    		else if (tmp == 3){
    			p[idx--] = '1';
    			carry = 1;
    		}
    		else{
    			carry = 0;
    			p[idx--] = tmp + '0';
    		}
    		i--;
    		j--;
    	}
    	
    	if (carry == 1){
    		char *q = (char *)malloc(sizeof(char)* (len + 2));
    		q[0] = '1';
    		for (i = 0; i < len + 1; i++) q[i + 1] = p[i];
    		return q;
    	}
    	else{
    		return p;
    	}
    }

    另一种比较优美的写法。

    //C
    
    char * addBinary(char * a, char * b){
        int len1 = strlen(a),len2 = strlen(b),carry = 0,k = 0;
        int i,j;
        char *c = (char *)malloc(sizeof(char)*(len1 + len2));
        //核心代码,从右往左进行运算
        for(i = len1 - 1,j = len2 - 1;i >= 0 || j >= 0 || carry;--i,--j){
            //很可能有a,b数组长度不等的时候,所以会有i,j小于0的情况,这时直接把该位置为0即可
            int x = i < 0 ? 0 : a[i] - '0';
            int y = j < 0 ? 0 : b[j] - '0';
    
            int sum = (x + y + carry) % 2;  //存入数组中的值
    
            carry = (x + y + carry) / 2;    //进位
            c[k++] = sum + '0';
        }
        c[k] = '';    //结束字符
    
        //翻转字符串
        for(i = 0,j = k - 1;i < j;i++,j--){
            char cc = c[i];
            c[i] = c[j];
            c[j] = cc;
        }
        return c;
    }
    
    //JS
    var addBinary = function(a, b) {
        let res = "", carry = 0, tmp = 0, lena = a.length, lenb = b.length;
        for(var i = lena - 1, j = lenb - 1; i >= 0 || j >= 0 || carry; i--, j--){
            let x = i >= 0 ? Number(a[i]) : 0,
            y = j >= 0 ? Number(b[j]) : 0;
    
            tmp = carry + x + y;
    
            if(tmp >= 2){
                carry = 1;
                res = tmp % 2 + res;
            }
            else{
                carry = 0;
                res = tmp + res;
            }
        }
        return res;
    };
    

    JS中的BigInt数据类型

    //JS
    
    var addBinary = function(a, b) {
      return (BigInt('0b' + a) + BigInt('0b' + b)).toString(2); //0b是二进制前缀
    }
    

      

  • 相关阅读:
    【动态规划】数字三角形4
    【动态规划】数字三角形3
    【动态规划】数字三角形2
    被破坏的电力系统
    二分法求函数的零点
    膨胀的木棍
    不重复地输出数
    和为给定数
    乘法游戏
    「AHOI2014/JSOI2014」拼图
  • 原文地址:https://www.cnblogs.com/JesseyWang/p/13088120.html
Copyright © 2020-2023  润新知