LeeTCode (67):二进制求和

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对象。

你可能感兴趣的:(LeetCode)