今天做了leetcode67题,两个2进制数相加,回想了一下其实有很多这种类型的题,比如leetcode2两数相加。

在做这种题时我自己的思路就是先循环遍历一个短的,然后跳出循环,判断是哪个结束,再接着合并。比如67题如下:

给定两个二进制的字符串,比如a=”11“,b=”1“,返回结果”100“。

string addBinary(string a, string b) {
int pos_a = a.size() -;
int pos_b = b.size() -;
int length = max(a.size(), b.size())+;
string result(length,' ');
int add = ;
int i = length - ;
//从后向前遍历,直到一个string用完
for ( ; i >= ; i--) {
if (- == pos_a || - == pos_b)
break;
//有进位的情况
if (a[pos_a] + b[pos_b] + add - '' - ''>= ) {
result[i] = (a[pos_a] -'' + b[pos_b] - ''+ add)% + '';
add = ;
}else{
result[i] = (a[pos_a] - '' + b[pos_b] - '' + add) + '';
add = ;
}
pos_a--;
pos_b--;
}
//如果两个都用完
if (- == pos_a && - == pos_b) {
if (add == )
result.erase(, );
else
result[] = '';
return result;
}
//如果只有a用完
if (- == pos_a) {
while (pos_b != -) {
result[i--] = (b[pos_b] -''+ add)% + '';
add = (b[pos_b--] + add - '')/ ;
}
if (add == )
result[] = '';
else
result.erase(,);
}else{
//如果只有b用完
while (pos_a != -) {
result[i--] = (a[pos_a]-'' + add) % +'';
add = (a[pos_a--] + add - '') / ;
}
if (add == )
result[] = '';
else
result.erase(, );
}
return result;
}

67的复杂解法

这使得代码再跳出第一次循环后还需要做很多的工作,而且一不小心还会因为边界条件出错,所以需要寻找一个更加简洁的方法来处理这种问题,寻找leetcode中这种题,多练习一下。

string addBinary(string a, string b) {
string result = "";
int pos_a = a.size() - ;
int pos_b = b.size() - ;
int add = ;
while (pos_a != - || pos_b != - || add == ) {
if (pos_a != -)
add += a[pos_a--] - '';
if (pos_b != -)
add += b[pos_b--] - '';
result = char(add % + '') + result;
add = add/;
}
return result;
}

67的简便写法

上面这种方式代码要简洁很多而且也不容易写错,注意char和string可以直接进行拼接。

在考虑leetcode2,两数相加问题。

同样是使用和上述一样的方法

ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
int add = ;
ListNode result(-);
ListNode* pos = &result;
while (l1 != NULL || l2 != NULL || add != ) {
if (l1 != NULL) { add += l1->val; l1 = l1->next; }
if (l2 != NULL) { add += l2->val; l2 = l2->next; }
ListNode *temp = new ListNode(add % );
pos->next = temp;
pos = pos->next;
add = add / ;
}
return result.next;
}

2的简便解法

最新文章

  1. CSS 3学习——box-sizing和背景
  2. firefox
  3. C/C++函数调用的几种方式及函数名修饰规则以及c++为什么不允许重载仅返回类型不同的函数
  4. 条款19:设计class犹如设计type
  5. ionic 嵌套view 的方法
  6. pop()实现逐个删除数组最后一位并输出
  7. 186. Reverse Words in a String II
  8. 【MINA】OrderedThreadPoolExecutor和UnorderedThreadPoolExecutor的事件监听线程池的选择
  9. 实测Eclipse连接小米2S调试问题
  10. 导出Ext.grid.Panel到excel
  11. Python入门:购物车实例
  12. tcp_listen函数
  13. html表单的使用
  14. Delphi应用程序的调试(一)
  15. 一套准确率高且效率高的分词、词性标注工具-thulac
  16. sql计算总页数
  17. Python爬虫实战---抓取图书馆借阅信息
  18. Scribe+HDFS日志收集系统安装方法
  19. HUST 1017 Exact cover(DLX精确覆盖)
  20. chkconfig设置开机自启动的原理

热门文章

  1. CCNA(001):Packet Tracer简单使用
  2. js获取当前页面的url网址信息小汇总
  3. python之路(十七)-javascript
  4. U-Boot bootargs简析
  5. github install
  6. 关于Android 8.0java.lang.SecurityException: Permission Denial错误的解决方法
  7. MySQL基础操作1
  8. jQuery 购物车
  9. Hibernate知识总结(一)
  10. MySQL--更新自增列的潜在风险