Given two binary strings, return their sum (also a binary string).
For example,
a = “11”
b = “1”
Return “100”.
用了两个指针分别指向a和b的末尾,然后每次取出一个字符,转为数字,若无法取出字符则按0处理,然后定义进位carry,初始化为0,将三者加起来,对2取余即为当前位的数字,对2取商即为当前进位的值,记得最后还要判断下carry,如果为1的话,要在结果最前面加上一个1,参见代码如下:
class Solution {
public:
string addBinary(string a, string b) {
int la = a.size() - 1;
int lb = b.size() - 1;
//int n = min(la, lb);
string res = "";
int aa;
int bb;
int sum;
int carry = 0;
while(la >= 0 || lb >= 0)
{
aa = la >= 0 ? a[la--] - '0' : 0;
bb = lb >= 0 ? b[lb--] - '0' : 0;
sum = aa + bb + carry;
res = to_string(sum % 2) + res;
carry = sum / 2;
}
if(carry == 1)
{
res = "1" + res;
}
return res;
}
};
总结:
1)从末尾开始处理,逐渐向前,用while循环,每处理一次指针减1;
2)两个字符串不一定等长,所以while循环判断条件若其中一个字符串还没遍历完,则循环继续执行,此时已经遍历完的字符串直接取0;
3)字符变对应的数字,可以减去‘0’;
4)数字变字符,用to_string()函数;
5)当前位的值,sum % 2;是否进位,sum / 2;
6)string类型加法为连接字符串生成新的string类型。但是加法操作的左右操作数必须有一个是string类型,不然会产生编译错误
string str2=“myword”;
string str1=str2+“hellow”;
string str3=str1+“bill”+str2;
string str4="“hellow”+“world”+str2;//this is wrong;
对于stl算法也是一样的比如
string str=accumulate(st2.begin(),str2.end(),“hellow”);//编译时错误,因为第三个参数是字符串字面值,会导致累加类型都为const char* 类型,违背string类型加法操作
string str=accumulate(str2.begin(),str2.end(),string(“hellow”));//编译正确
7)虽然String不是基本数据类型,但是比较特殊的。如果是String str = “abc”,那么adc其实是放在常量池里面的。如果Sring str = new String(“abc”),则是放在堆里面,因为这里new了一个对象str出来。所以两者==,返回的则为false。所以遇到这种情况时,则用equals方法,返回的结果无疑时true。
总结:
当s1=“a”+"b"时,JVM在编译的时候直接编译为s1=“ab”。
当s3=s1+s2时,则是先创建一个StringBuffer对象,然后通过append方法,将字符拼接为“ab”,最后转换为String对象。