深入解析:【每日算法C#】二进制求和 LeetCode
方法介绍
public string AddBinary(string a, string b)
{
int i = a.Length - 1;
int j = b.Length - 1;
int carry = 0;
string result = "";
while (i >= 0 || j >= 0 || carry > 0)
{
int sum = carry;
if (i >= 0)
{
sum += a[i] - '0';
i--;
}
if (j >= 0)
{
sum += b[j] - '0';
j--;
}
result = (sum % 2) + result;
carry = sum / 2;
}
return result;
}
这段代码实现的是两个二进制字符串的加法,返回它们的和(仍为二进制字符串)。以下是核心逻辑的总结:
- 输入:两个二进制字符串
a和b(例如"1010"和"1011")。 - 输出:它们的二进制和(例如
"10101")。 - 算法:
- 从字符串的末尾(最低位)开始逐位相加。
- 使用
carry记录进位。 - 每次计算当前位的和(
sum),并更新进位(carry = sum / 2)。 - 将当前位的值(
sum % 2)拼接到结果字符串的左侧。
隐式转换说明
代码中涉及以下隐式转换(由编译器自动完成):
1. 字符到整数的转换
sum += a[i] - '0';
a[i]是一个字符('0'或'1')。'0'的 ASCII 值是48,'1'是49。a[i] - '0'通过减法将字符隐式转换为整数:'0' - '0' = 0'1' - '0' = 1
2. 整数到字符的转换
result = (sum % 2) + result;
sum % 2的结果是0或1(整数)。- 在与字符串
result拼接时,整数被隐式转换为字符:0→'0'1→'1'
3. 整数除法的截断
carry = sum / 2;
sum / 2是整数除法,结果会被截断为整数:- 若
sum = 2,则carry = 1。 - 若
sum = 1,则carry = 0。
- 若
关键点分析
字符与整数的转换:
- 通过
- '0'将字符'0'/'1'转换为整数0/1,是二进制字符串处理的常见技巧。 - 反向转换(整数 → 字符)通过字符串拼接自动完成。
- 通过
进位逻辑:
sum的范围是0、1或2(因为每位相加的最大值是1 + 1 + 1 = 3)。sum % 2得到当前位的值,sum / 2得到进位值。
字符串拼接的方向:
- 结果是从最低位开始构建的,因此每次拼接在字符串的左侧(
result = (sum % 2) + result)。
- 结果是从最低位开始构建的,因此每次拼接在字符串的左侧(
示例演示
以 a = "1010" (十进制 10)和 b = "1011" (十进制 11)为例:
- 初始状态:
i = 3,j = 3,carry = 0,result = ""。
- 逐步计算:
- 第一轮:
sum = 0 + 0 + 1 = 1→result = "1",carry = 0。 - 第二轮:
sum = 0 + 1 + 1 = 2→result = "01",carry = 1。 - 第三轮:
sum = 1 + 0 + 0 = 1→result = "101",carry = 0。 - 第四轮:
sum = 0 + 1 + 1 = 2→result = "0101",carry = 1。 - 第五轮:
sum = 1→result = "10101",carry = 0。
- 第一轮:
- 结果:
"10101"(十进制 21)。
优化建议
使用
StringBuilder:- 当前方法通过字符串拼接效率较低,建议改用
StringBuilder的Insert(0, value)方法。 - 示例:
var sb = new StringBuilder(); sb.Insert(0, sum % 2);
- 当前方法通过字符串拼接效率较低,建议改用
边界条件处理:
- 如果输入为空字符串,可以直接返回另一个字符串:csharp
插入
复制
新建文件
保存
应用代码
if (string.IsNullOrEmpty(a)) return b; if (string.IsNullOrEmpty(b)) return a;
- 如果输入为空字符串,可以直接返回另一个字符串:csharp
总结
- 隐式转换:通过字符与整数的加减实现类型转换,是二进制字符串处理的核心技巧。
- 算法效率:时间复杂度为
O(n)(n是较长字符串的长度),但字符串拼接部分可以优化。 - 适用场景:适用于任意长度的二进制字符串加法。
浙公网安备 33010602011771号