刷题日记Day2 剑指offer II 002

82 阅读1分钟

image.png

看到这个题目,一开始有点无从下手,我想的是从后往前去进行相加,但是很显然这样实现比较困难,那么我们为什么不 翻转这个字符串 呢?这样不就是从后往前相加了吗。于是,第一版解答出来了。

题解

class Solution {
public:
    string addBinary(string a, string b) {
        // 翻转两个字符串
        reverse(a.begin(),a.end());
        reverse(b.begin(),b.end());
        
        int n = max(a.size(),b.size()),carry = 0;
        string res;
        for(int i=0;i<n;i++){
            carry+= i<a.size()?(a.at(i)=='1'):0;
            carry+= i<b.size()?(b.at(i)=='1'):0;
            if(carry == 3){
                res.append("1");
                carry =1;
            }
            else if(carry == 2 ) {
                res.append("0");
                carry = 1;
            }
            else if(carry == 1){
                res.append("1");
                carry = 0;
            }
            else if(carry == 0){
                res.append("0");
                carry = 0;
            }
        }

        if(carry){
            res.append("1");
        }

        reverse(res.begin(),res.end());
        return res;
    }
};

但是,显然,中间的判断太过于冗长,并且,在第一次解答的过程中,我漏掉了 carry = 3 的情况。显然,这样并不好。于是,第二班版解答出现了。

class Solution {
public:
    string addBinary(string a, string b) {
        // 翻转两个字符串
        reverse(a.begin(),a.end());
        reverse(b.begin(),b.end());
        
        int n = max(a.size(),b.size()),carry = 0;
        string res;
        for(int i=0;i<n;i++){
            carry+= i<a.size()?(a.at(i)=='1'):0;
            carry+= i<b.size()?(b.at(i)=='1'):0;
            if(carry%2==1) res.append("1");
            else res.append("0");
            carry/=2;
        }

        if(carry){
            res.append("1");
        }

        reverse(res.begin(),res.end());
        return res;
    }
};

很容易看出,第一版我忘记了二进制的本质,那就是二的倍数,第二版的优化明显比第一版更加优雅,但是在LeetCode上的耗时和占用的空间更加的大。

结语

算法小白的算法笔记。

文章如果有不正确的地方,欢迎指正,共同学习,共同进步。

若有侵权,请联系作者删除。