NO.55-AI刷题题解 | 豆包MarsCode AI刷题

74 阅读4分钟

NO.55 二进制之和

二进制之和

问题描述

小U和小R喜欢探索二进制数字的奥秘。他们想找到一个方法,将两个二进制字符串相加并以十进制的形式呈现。这个过程需要注意的是,他们的二进制串可能非常长,所以常规的方法可能无法处理大数。小U和小R希望你帮助他们设计一个算法,该算法能在保证时间复杂度不超过O(n^2)的前提下,返回两个二进制字符串的十进制求和结果。


测试样例

样例1:

输入:binary1 = "101" ,binary2 = "110"
输出:'11'

样例2:

输入:binary1 = "111111" ,binary2 = "10100"
输出:'83'

样例3:

输入:binary1 = "111010101001001011" ,binary2 = "100010101001"
输出:'242420'

样例4:

输入:binary1 = "111010101001011" ,binary2 = "10010101001"
输出:'31220'

样例5:

输入:binary1 = "11" ,binary2 = "1"
输出:'4'

【逐位模拟二进制加法】

题目解析
  1. 从二进制最低位开始计算
    • 逐位处理两个二进制字符串,考虑进位。
    • 模拟二进制加法:每一位的计算结果为当前两位的和加上进位,取余后保留,进位取整除值
  2. 结果构造
    • 从最低位计算到最高位,按顺序构造二进制和的结果
  3. 结果转为十进制
    • 最终结果是一个二进制字符串,将其转为十进制输出

定义变量如下:

  • 进位记录:carry
  • 当前低位索引:i , j
  • 当前低位数值:bit1 , bit2
  • 当前位之和:sum
  • 最终返回字符串:rst
代码实现
#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

std::string solution(std::string binary1, std::string binary2) {
    string rst = "";
    int carry = 0; // 进位
    int i = binary1.size() - 1, j = binary2.size() - 1; //当前低位索引
    int bit1, bit2;
    // 从低位开始逐位计算
    while(i >= 0 || j >= 0 || carry) {
        if(i >= 0){ //取第一个数的当前位
            bit1 = binary1[i--] - '0';
        }else bit1 = 0;
        if(j >= 0){ //取第二个数的当前位
            bit2 = binary2[j--] - '0';
        }else bit2 = 0;
        
        int sum = bit1 + bit2 + carry; //当前位的和
        carry = sum / 2;               //计算进位
        rst += (sum % 2) + '0';        //当前位的结果,并转化成字符加入rst中
    }

    // 反转结果字符串(从低位到高位)
    reverse(rst.begin(), rst.end());

    // 将二进制字符串转换为十进制
    long long decimal = 0;
    for(int i = 0;i < rst.length();i++) {
        decimal = decimal * 2 + (rst[i] - '0');
    }
    return to_string(decimal);
}

注意:

  • 对于传入的参数是 string 类型数据,需要对其进行- '0'的操作将字符转成数字
  • 留意所采用的方案是从低位计算到高位并存入 rst 字符串,所以需要对字符串进行反转才能得到正确的预期结果

【利用大整数库直接计算】

题目解析
  1. 将二进制数据转化成十进制
    • 每次将当前累加和乘2并加上当前位的值,将二进制转化成十进制
  2. 结果计算
    • 将转化后的十进制数直接相加得到预期结果
  3. 结果转为字符串
    • 最终结果是一个十进制字符串,将现有的数字结果转化成字符串

定义变量如下:

  • 二进制转为十进制过程的累加和:decimal
  • 二进制转为十进制的结果:num1 , num2
代码实现
#include <iostream>
#include <string>

using namespace std;

long long binary_to_decimal(const string& binary) {
    long long decimal = 0;
    for(int i = 0;i < binary.length();i++) {
        decimal = decimal * 2 + (binary[i] - '0'); //每次将当前累加和乘2并加上当前位的值
    }
    return decimal;
}

std::string solution(std::string binary1, std::string binary2) {
    //转换两个二进制字符串为十进制
    long long num1 = binary_to_decimal(binary1);
    long long num2 = binary_to_decimal(binary2);
    
    //求和并转换为字符串
    return to_string(num1 + num2);
}

注意:

  • 这是一个简易的实现方案,借助了 long long 这一大整数结构完成题目
  • 利用 to_string 对求和结果从数字转化成字符串