【Add binary】cpp
题目:
Given two binary strings, return their sum (also a binary string).
For example,
a = "11"
b = "1"
Return "100"
.
代码:
class Solution { public: string addBinary(string a, string b) { std::string result; std::string::reverse_iterator ia = a.rbegin(); std::string::reverse_iterator ib = b.rbegin(); int carry = 0; for ( int sum=0, part_a=0, part_b=0; ia!=a.rend() || ib!=b.rend(); ia==a.rend()? a.rend() : ++ia, ib==b.rend()? b.rend() : ++ib ) { part_a = ia==a.rend() ? 0 : *ia-'0'; part_b = ib==b.rend() ? 0 : *ib-'0'; sum = part_a + part_b + carry; result.insert(result.begin(), sum%2+'0'); carry = sum/2; } if ( carry==1 ) result.insert(result.begin(), '1'); return result; } };
tips:
1. 熟悉string的一些方法:rbegin rend insert
2. 熟悉int与其对应的char的转换方法。
顺道复习了一下c++ primer plus上类型转换的章节:
1. 赋值时进行转换: 变量类型不一样,可能产生潜在的丢失或者失去精度。
2. 表达式中的转换
3. 传参时类型转换
4. 强制类型转换
另外,
part_a = ia==a.rend() ? 0 : *ia-'0'; (int)
result.insert(result.begin(), sum%2+'0'); (char)
同样是int与char之间的加减运算,为什么返回的类型不一样呢?
猜测应该是这样的:运算时都转化成ASCII码的值进行加减;最后如果要求是int的就保持int型,需要是char的就转换成char型。
c++ primer plus (第四版) 45~47讲解了这种转换。
'0'可以理解为字符常量,在内存中就是按照整型存的。
又试验了一下
char c = 65+1;
int i = 65+1;
cout << c << endl;
cout << i << endl;
输出结果是:
B
66
通过这个例子就可以记住char的一些性质了
另外,通过这个例子,复习了单双引号的不同:c++中char常量用单引号括起;双引号表示字符串,二者差别还是很大的。
PS:之前还傻搜字符跟整形转换... c++中将char在内存中存成了整型,正是因此带来了极大的便利,可以很轻松的通过加减来灵活处理字符。
那么,如果是中文或者日文这种不止256个字符的语系呢?可以有wchar_t类型(本质就用来编码的bits比8位多了)
wchar_t a = L'A' (前缀L表示宽字符常量)
========================================
第二次过这道题,复习了一下digit跟char的一些操作运算。
class Solution { public: string addBinary(string a, string b) { const int len_a = a.size(); const int len_b = b.size(); vector<char> ret; int i_a = len_a-1; int i_b = len_b-1; int carry = 0; while ( i_a>=0 || i_b>=0 ) { int part1 = i_a>=0 ? a[i_a] : '0'; int part2 = i_b>=0 ? b[i_b] : '0'; int tmp_sum = (part1-'0') + (part2-'0') + carry; carry = tmp_sum / 2; int curr = tmp_sum % 2; ret.insert(ret.begin(), curr+'0'); i_a = i_a>=0 ? i_a-1 : i_a; i_b = i_b>=0 ? i_b-1 : i_b; } if (carry==1) ret.insert(ret.begin(), carry+'0'); return string(ret.begin(),ret.end()); } };
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?