力扣1073. 负二进制数相加 C++

思路

正常如果看二进制不太好看出来规律,得拆开看
如 [1,1,1,1,1]+[1,0,1]列竖式也看不出来啥
列成这样

(-2)^4+(-2)^3+(-2)^2+(-2)^1+(-2)^0
              (-2)^2+       (-2)^0

可以看出来两个(-2)2和(-2)0 两个可以变成2^3和2,就可以和前面一位的1抵消,同时这一位也变成0
就变成 (-2)^4,就可以得到结果[1,0,0,0,0]
当然如果相同的位为奇数位(当最后一位为偶数位),也同理。

现在就剩两种情况,但是奇偶规律相同,所以就剩一种情况:
如[1,1,0,1,1]+[1,0,1,0]

(-2)^4+(-2)^3+0*(-2)^2+(-2)^1+(-2)^0
       (-2)^3+0*(-2)^2+(-2)^1+0*(-2)^0

按照之前的情况规律来,应该位进位的前一位减1,但是前一位为0所以减不了,这个时候就想到了学减法的时候的借位
就向0之前借一位,但这个时候不能在借位那位减1,因为符号是相反的,所以应该加1,
这个时候写出来是这样

(-2)^4+(-2)^3+(-2)^3+2*(-2)^2+(-2)^1+(-2)^0
       (-2)^3+       0*(-2)^2+(-2)^1+0*(-2)^0

(-2)^4+2*(-2)^3+2*(-2)^2+(-2)^1+(-2)^0
         (-2)^3+0*(-2)^2+(-2)^1+0*(-2)^0

再使用最开始的规律就可以得出结果。
但是呢,又有人问了,那最高位再借位呢。就将两个数组补齐,再在最高位前面加两个0就可以了,使用栈存一下就能得到结果了

写的不好仅供参考

代码

class Solution {
    
    
public:
    vector<int> addNegabinary(vector<int>& arr1, vector<int>& arr2) {
    
    
        int temp=0;
        int s1=arr1.size(),s2=arr2.size();
        int size=abs(s1-s2);
        vector<int>& p=s1<s2?arr1:arr2;
        push(p,size);
        push(arr1,2);
        push(arr2,2);
        stack<int> s;
        //偶位相加进1奇位减1 若奇位为0 ... 奇位同理
        auto it1=arr1.rbegin(),it2=arr2.rbegin();
        while(it1!=arr1.rend()||it2!=arr2.rend()){
    
    
            int t=*it1+*it2+temp;
            int jin=0;
            if(t<0){
    
    
                t+=2;
                jin=1;
            }
            else jin=-1*t/2;
            s.push(t%2);
            temp=jin;
            it1++;
            it2++;
        }
        trim(s);
        if(s.empty()) return {
    
    0};
        vector<int> res;
        while(!s.empty()){
    
    
            res.push_back(s.top());
            s.pop();
        }
        return res;
    }

    void push(vector<int>& p,int size){
    
    
        while(size--){
    
    
            p.insert(p.begin(),0);
        }
    }

    void trim(stack<int>& s){
    
    
        while(!s.empty()&&s.top()==0){
    
    
            s.pop();
        }
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_43891802/article/details/128779795