67.二进制求和

  1. 67.二进制求和
    1. 67.1 题目
    2. 67.2 题解
      1. 逐位相加
    3. 67.3 代码
    4. 67.4 运行结果

67.二进制求和


67.1 题目

给你两个二进制字符串 ab,以二进制字符串的形式返回它们的和。

示例 1:

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

示例 2:

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

提示:

  • 1 <= a.length, b.length <= 10^4
  • ab 仅由字符 '0''1' 组成
  • 字符串如果不是 "0",就不含前导零

67.2 题解

逐位相加

// 方法一:逐位相加
// 从字符串末尾开始逐位相加,模拟二进制加法过程,注意进位的处理
static string AddBinary1(string a, string b)
{
    // 初始化两个索引 i 和 j 分别指向字符串 a 和 b 的末尾
    int aIndex = a.Length - 1;
    int bIndex = b.Length - 1;

    // 初始化进位值为 0
    int carry = 0;

    // 创建一个 StringBuilder 用于保存二进制相加的结果
    StringBuilder stringBuilder = new StringBuilder();

    // 循环直到两个字符串全部处理完毕且进位为 0
    while (aIndex >= 0 || bIndex >= 0)
    {
        // 获取当前位置的二进制值,如果索引超出字符串范围则默认为 0
        int aNowValue = (aIndex >= 0) ? a[aIndex--] - '0' : 0;
        int bNowValue = (bIndex >= 0) ? b[bIndex--] - '0' : 0;

        // 计算当前位的和以及进位值
        int sum = aNowValue + bNowValue + carry;
        carry = sum / 2;

        // 在结果的开头插入当前位的二进制值
        stringBuilder.Insert(0, sum % 2);
    }

    // 如果最高位有进位,将 '1' 插入结果的开头
    if (carry > 0)
    {
        stringBuilder.Insert(0, '1');
    }

    // 将 StringBuilder 转换为 string 并返回结果
    return stringBuilder.ToString();
}

67.3 代码

using System;
using System.Text;

class Program
{
    static void Main()
    {
        #region 题目

        // 给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。
        // 示例 1:
        // 输入:a = "11", b = "1"
        // 输出:"100"
        // 示例 2:
        // 输入:a = "1010", b = "1011"
        // 输出:"10101"
        // 提示:
        // 1 <= a.length, b.length <= 104
        // a 和 b 仅由字符 '0' 或 '1' 组成
        // 字符串如果不是 "0" ,就不含前导零

        #endregion

        #region 测试

        // 示例 1
        string a1 = "11", b1 = "1";
        string result1_1 = AddBinary1(a1, b1);
        Console.WriteLine($"示例1 方法1 输出:{result1_1}");


        // 示例 2
        string a2 = "1010", b2 = "1011";
        string result2_1 = AddBinary1(a2, b2);
        Console.WriteLine($"示例2 方法1 输出:{result2_1}");

        #endregion
    }

    #region 答案

    // 方法一:逐位相加
    // 从字符串末尾开始逐位相加,模拟二进制加法过程,注意进位的处理
    static string AddBinary1(string a, string b)
    {
        // 初始化两个索引 i 和 j 分别指向字符串 a 和 b 的末尾
        int aIndex = a.Length - 1;
        int bIndex = b.Length - 1;

        // 初始化进位值为 0
        int carry = 0;

        // 创建一个 StringBuilder 用于保存二进制相加的结果
        StringBuilder stringBuilder = new StringBuilder();

        // 循环直到两个字符串全部处理完毕且进位为 0
        while (aIndex >= 0 || bIndex >= 0)
        {
            // 获取当前位置的二进制值,如果索引超出字符串范围则默认为 0
            int aNowValue = (aIndex >= 0) ? a[aIndex--] - '0' : 0;
            int bNowValue = (bIndex >= 0) ? b[bIndex--] - '0' : 0;

            // 计算当前位的和以及进位值
            int sum = aNowValue + bNowValue + carry;
            carry = sum / 2;

            // 在结果的开头插入当前位的二进制值
            stringBuilder.Insert(0, sum % 2);
        }

        // 如果最高位有进位,将 '1' 插入结果的开头
        if (carry > 0)
        {
            stringBuilder.Insert(0, '1');
        }

        // 将 StringBuilder 转换为 string 并返回结果
        return stringBuilder.ToString();
    }

    #endregion
}

67.4 运行结果

示例1 方法1 输出:100
示例2 方法1 输出:10101


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏