列表

详情


NC188. 二进制求和

描述

给定两个用字符串表示的二进制数,返回他们的和。

数据范围:字符串长度满足 ,字符串中只含有 0 和 1,且保证除 0 以外的二进制数没有前导零的情况。

示例1

输入:

"101","1"

输出:

"110"

示例2

输入:

"0","1"

输出:

"1"

示例3

输入:

"1","1"

输出:

"10"

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 2ms, 内存消耗: 512KB, 提交时间: 2021-11-13

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param A string字符串 
     * @param B string字符串 
     * @return string字符串
     */
    string binaryAdd(string A, string B) {
        // write code here
        string res;
        int m = max(A.length(), B.length()), carry = 0;
        reverse(A.begin(), A.end());
        reverse(B.begin(), B.end());
        //遍历最长序列一次,结果长度最多只会增加一位
        for(int i = 0; i < m; i++){//this carry = (ai + bi + last carry)/2
            carry += i < A.size() ? (A.at(i) == '1') : 0;
            carry += i < B.size() ? (B.at(i) == '1') : 0;
            res.push_back((carry % 2) ? '1' : '0'); //这一位的值,注意此时添加的顺序是反的
            carry = carry/2; //new carry
        }
        if(carry) res.push_back('1');
        reverse(res.begin(), res.end());//反过来才是答案
        return res;
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 400KB, 提交时间: 2022-04-05

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param A string字符串 
     * @param B string字符串 
     * @return string字符串
     */
    string binaryAdd(string A, string B) {
        // write code here
        int lenA = A.size();
        int lenB = B.size();
        int maxLen = (lenA >= lenB) ? lenA : lenB;
        string result(maxLen + 1, ' ');
        int carry = 0;
        int pos = maxLen;
        
        
        for (int i = lenA - 1, j = lenB - 1;
             i >= 0 || j >= 0;) {
            int v1 = (i >= 0) ? (A[i] - '0') : 0;
            int v2 = (j >= 0) ? (B[j] - '0') : 0;
            int sum = v1 + v2 + carry;
            carry = sum / 2;
            result[pos--] = '0' + (sum % 2);
            if (i >= 0) {
                --i;
            }
            
            if (j >= 0) {
                --j;
            }
        }
        
        if (carry != 0) {
            result[pos--] = '0' + carry;
        }
        
        return result.substr(pos + 1);
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 412KB, 提交时间: 2022-02-06

class Solution {
public:
    /*
    方法一:模拟
    
    思路和算法
    我们可以借鉴「列竖式」的方法,末尾对齐,逐位相加。在十进制的计算中「逢十进一」,二进制中我们需要「逢二进一」。
    
    1. 具体的,我们可以取 n = max{∣a∣,∣b∣},循环 n 次,从最低位开始遍历。
    2. 我们使用一个变量 carry 表示上一个位置的进位,初始值为 0。
       记当前位置对其的两个位为 a_i​ 和 b_i,则每一位的答案为 (carry + a_i + b_i) % 2,
       下一位的进位为 (carry + a_i + b_i) / 2
    3. 重复上述步骤,直到数字 a 和 b 的每一位计算完毕。
    4. 最后如果 carry 的最高位不为 0,则将最高位添加到计算结果的末尾。
    
    注意,为了让各个位置对齐,你可以先反转这个代表二进制数字的字符串,然后低下标对应低位,高下标对应高位。
    当然你也可以直接把 a 和 b 中短的那一个补 0 直到和长的那个一样长,然后从高位向低位遍历,
    对应位置的答案按照顺序存入答案字符串内,最终将答案串反转。这里的代码给出第一种的实现。
    
    复杂度分析
    时间复杂度:O(n),这里的时间复杂度来源于顺序遍历 a 和 b。假设 n = max{∣a∣,∣b∣}。
    空间复杂度:O(1),除去答案所占用的空间,这里使用了常数个临时变量。
    */
    string binaryAdd(string a, string b) {
        string ans;
        reverse(a.begin(), a.end());
        reverse(b.begin(), b.end());
        
        int n = max(a.size(), b.size()), carry = 0;
        for (size_t i = 0; i < n; ++i) {
            carry += i < a.size() ? (a.at(i) == '1') : 0;
            carry += i < b.size() ? (b.at(i) == '1') : 0;
            ans.push_back((carry % 2) ? '1' : '0');
            carry /= 2;
        }
        
        if (carry) {
            ans.push_back('1');
        }
        reverse(ans.begin(), ans.end());
        
        return ans;
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 420KB, 提交时间: 2022-07-21

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param A string字符串 
     * @param B string字符串 
     * @return string字符串
     */
    string binaryAdd(string A, string B) {
        // write code here
        string res;
        int n = A.size();
        int m = B.size();
        int count = 0;
        int i = n - 1, j = m - 1;
        while(i >= 0 && j >= 0) {
            int tmp = A[i] - '0' + B[j]- '0' + count;
            res += '0' + tmp % 2;
            count = tmp / 2;
            i--;
            j--;
        }
        while(i >= 0) {
            int tmp = A[i] - '0' + count;
            res += '0' + tmp % 2;
            count = tmp / 2;
            i--;
        }
    
        while(j >= 0) {
            int tmp = B[j] - '0' + count;
            res += '0' + tmp % 2;
            count = tmp / 2;
            j--;
        }
        if(count) {
            res += '1';
        }
        reverse(res.begin(), res.end());
        return res;
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 424KB, 提交时间: 2021-12-07

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param A string字符串 
     * @param B string字符串 
     * @return string字符串
     */
    string binaryAdd(string A, string B) {
        // write code here
        int Alen=A.length(),Blen=B.length();
        if(Alen==0||Blen==0) return A+B;
        if(A[0]=='0') return B;
        if(B[0]=='0') return A;
        if(Alen<Blen) {
            swap(A,B);
            swap(Alen,Blen);
        }
        int k=0,tmp,i=Blen-1,j=Alen-1;
        while((A[j]=='0'||B[i]=='0')&&i>=0) {
            A[j]=(A[j]=='0'&&B[i]=='0')?'0':'1';
            --i,--j;
        }
        if(i<0) return A;
        for(;i>=0;--i,--j) {
            tmp=A[j]-'0'+B[i]-'0'+k;
            A[j]=(tmp)%2+'0';
            k=tmp/2;
        }
//        if(i==j&&k) return "1"+A;
        while(j>=0&&k) {
            tmp=A[j]-'0'+k;
            A[j]=tmp%2+'0';
            k=tmp/2;
            --j;
        }
        if(j<0&&k) return "1"+A;
        return A;
    }
};

上一题