LeetCode做题笔记 - 67 - 二进制求和(简单)
题目:二进制求和(难度:简单)
Given two binary strings, return their sum (also a binary string).
The input strings are both non-empty and contains only characters 1 or 0.
Example 1:
Input: a = "11", b = "1"
Output: "100"
Example 2:
Input: a = "1010", b = "1011"
Output: "10101"
思路
也许会想到先二进制转十进制,相加再转成二进制。但是因为题目的二进制数,没有保证大小,所以可能超出int范围。还是老老实实地从低位开始相加进位。
设一个标志表示进位。以较长的那个字符串为基础进行操作。
从最低位开始,向高位遍历。每一位有以下几种情况(进位表示从低位获得的进位):
- 1+1+进位:得1,并向高位进位
- 1+1:得0,并向高位进位
- 1+0+进位:得0,并向高位进位
- 1+0:得0,无进位
- 0+0+进位:得到1,无进位
- 0+0:得到0,无进位
当较短的字符串遍历到头后,如果无进位,则结束。若有进位,则继续遍历较长的字符串,处理进位。
如果较长的字符串遍历到头,而且仍有进位,则最高位之前再添加一位1。
代码
class Solution {
public:
string addBinary(string a, string b) {
bool carry = false; // 进位
int i = a.size()-1;
int j = b.size()-1;
string * base = i > j ? &a : &b; // 选择较长的作为基础
int * it = i > j ? &i : &j;
for (; i>=0 && j>=0; --i, --j)
{
if (a[i]=='1' && b[j]=='1')
{
(*base)[*it] = carry ? '1' : '0';
carry = true;
}
else if (a[i]=='0' && b[j]=='0')
{
(*base)[*it] = carry ? '1' : '0';
carry = false;
}
else // 0+1
{
(*base)[*it] = carry ? '0' : '1';
carry = carry ? true : false;
}
}
// 较短的遍历结束,仍有进位
while (carry && *it >= 0)
{
bool isZero = ((*base)[*it] == '0');
(*base)[*it] = isZero ? '1' : '0';
carry = isZero ? false : true;
--(*it);
}
// 较长的遍历结束,仍有进位
if (carry)
{
return (string(1, '1').append(*base));
}
return *base;
}
};
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】