把以字符串表示的两个二进制数相加。
【思路】
活学活用昨天学到的reverse。将倒序相加变成正序相加。
但这样的话,就要用到三个reverse,两个原串,最后还要把结果翻转。
可能对速度有影响,经测试,好像还比不翻转快一点点。
一个point是,两串长度不同,一串加完了另一串怎么办?
我的办法是将其视为0,这样就能统一为 a[i]+b[i]+flag的形式。
【my code】
string addBinary(string a, string b) { string c=""; int i, j; int aa,bb; int flag=0; reverse(a.begin(), a.end()); reverse(b.begin(), b.end()); for(i=0; i<a.size()||i<b.size(); i++) { if(i<a.size()&&i<b.size()){ aa=a[i]-'0'; bb=b[i]-'0'; } else if(i>=a.size()){ aa=0; bb=b[i]-'0'; } else if(i>=b.size()){ bb=0; aa=a[i]-'0'; } if(aa+bb+flag>2){ c.push_back('1'); flag=1; } else if(aa+bb+flag>1){ c.push_back('0'); flag=1; } else if(aa+bb+flag>0){ c.push_back('1'); flag=0; } else{ c.push_back('0'); flag=0; } } if(flag==1) c.push_back('1'); reverse(c.begin(), c.end()); return c; }
【other code】
class Solution { public: string addBinary(string a, string b) { // Start typing your C/C++ solution below // DO NOT write int main() function int flag = 0; int aIndex = a.size() - 1; int bIndex = b.size() - 1; string c; while(aIndex >= 0 && bIndex >= 0) { int num = a[aIndex] - '0' + (b[bIndex] - '0') + flag; flag = num / 2; num %= 2; c = (char)(num + '0') + c; aIndex--; bIndex--; } while(aIndex >= 0) { int num = a[aIndex] - '0' + flag; flag = num / 2; num %= 2; c = (char)(num + '0') + c; aIndex--; } while(bIndex >= 0) { int num = b[bIndex] - '0' + flag; flag = num / 2; num %= 2; c = (char)(num + '0') + c; bIndex--; } if (flag > 0) c = (char)(flag + '0') + c; return c; } };
【评价】
1.用string的“+”操作可以将两个串按自己想要的顺序连接,这样就把新的结果放在前面,再连上以前的结果,最后不需要翻转。
这个技巧要学会。
2.flag=num/2;
num%=2;
两句话就表明了我for中的一大坨,两者结合,代码就更短啦!
【郑重声明】
每篇文章的other code皆是百度直接搜索题目的结果,大部分来自remolostime的博客园,地址是:
http://www.cnblogs.com/remlostime/tag/LeetCode/
向前辈致敬。