1073. 负二进制数相加(leetcode,模拟,数学分析)-------------------c++实现

1073. 负二进制数相加(leetcode,模拟,数学分析)-------------------c++实现

题目表述

给出基数为 -2 的两个数 arr1 和 arr2,返回两数相加的结果。

数字以 数组形式 给出:数组由若干 0 和 1 组成,按最高有效位到最低有效位的顺序排列。例如,arr = [1,1,0,1] 表示数字 (-2)^3 + (-2)^2 + (-2)^0 = -3。数组形式 中的数字 arr 也同样不含前导零:即 arr == [0] 或 arr[0] == 1。

返回相同表示形式的 arr1 和 arr2 相加的结果。两数的表示形式为:不含前导零、由若干 0 和 1 组成的数组。

样例

示例 1:

输入:arr1 = [1,1,1,1,1], arr2 = [1,0,1]
输出:[1,0,0,0,0]
解释:arr1 表示 11,arr2 表示 5,输出表示 16 。
示例 2:

输入:arr1 = [0], arr2 = [0]
输出:[0]
示例 3:

输入:arr1 = [0], arr2 = [1]
输出:[1]

条件

1 <= arr1.length, arr2.length <= 1000
arr1[i] 和 arr2[i] 都是 0 或 1
arr1 和 arr2 都没有前导0

思路

自己思路:
用每个位加法计算,1+1可以和-2抵消,也可以变成4+(-2),所以如果同一位相加大于等于2,就有多种情况:
1.等于2or3:
前一位-1 or 前一位和前二位都+1(3的话此位为1,2的话此位为0)
2.等于4:
前一位-2 or 前二位+1
通过模拟可以得出 单位的最大值就为4,所以无需考虑其他。

答案思路(精彩绝伦):
用一位add作为进位计数,如果进位后的下一位再次计算时加和为-1,则此位变1,然后进位计数为1.

注意点

计算分3部分组成:
1.arr1和arr2相同位数
2.处理max(arr1,arr2)的位数
3.处理多余位数
最后需要再处理前导0位。
1073. 负二进制数相加(leetcode,模拟,数学分析)-------------------c++实现_第1张图片
第一个通过为答案解法 第二个通过为作者自己解法。

ac代码

c++:

自己思路

#include
#include
using namespace std;
class Solution {
public:
    void DealResult(vector<int> &result,int now,int sit)
    {
        if(now==1)
        result[sit]=1;
        else
        result[sit]=0;
        if(now>=2&&now<=3)
        {
            if(result[sit-1]==0)
            {result[sit-1]+=1;
             result[sit-2]+=1;
            }
            else
            result[sit-1]-=1;
            if(now==3)
            result[sit]=1;
            
        }
        if(now==4)
        {
            if(result[sit-1]==2)
            result[sit-1]-=2;
            else
            result[sit-2]+=1;
        }
    }
    vector<int> addNegabinary(vector<int>& arr1, vector<int>& arr2) {
        vector<int> result(max(arr1.size(),arr2.size())+3,0);
        int now;
       int i=arr1.size()-1,j=arr2.size()-1,k=result.size()-1;
       //deal arr1,arr2,result;
        while(i>=0&&j>=0)
        {
            now = arr1[i]+arr2[j]+result[k];
            DealResult(result,now,k);
            i--;j--;k--;
        }
        //get the bigger arr to remain
        vector<int> remain(max(i+1,j+1),0);
        int remainsit = 0;
        if(i>=0)
        {
            copy(arr1.begin(),arr1.begin()+i+1,remain.begin());
            remainsit = i;
        }
        else
        {
            copy(arr2.begin(),arr2.begin()+j+1,remain.begin());
            remainsit = j;
        }
 		//deal the remain
        while(remainsit>=0)
        {
                now=remain[remainsit]+result[k];
                DealResult(result,now,k);
                k--;remainsit--;
        }
        //deal the sit > max(arr1,arr2)
        while(k>=0)
        {
            now = result[k];
            DealResult(result,now,k);
            k--;
        }
        now = 0;
        //deal leading zeros
        while(now<result.size()-1)
        {
            if(result[now]==0)
            now++;
            else
            break;
        }
    result.erase(result.begin(),result.begin()+now);
    return result;
    }
};

int main(){
    
    Solution s;
    int a1[2]={1,1},a2[2]={1,1};
    vector<int> arr1,arr2;
    for(auto x:a1)
    arr1.push_back(x);
    for(auto x:a2)
    arr2.push_back(x);
    vector<int> result = s.addNegabinary(arr1,arr2);
    for(auto x:result)
    cout<<x<<" ";
}

c++:

答案思路

class Solution {
public:
    vector<int> addNegabinary(vector<int>& arr1, vector<int>& arr2) {
        int i=arr1.size()-1,j=arr2.size()-1;
        vector<int> ans;
        int add=0;
        int x=0;
   
        while(i>=0||j>=0||add)
        {
            x=0;
            if(i>=0)
            x+=arr1[i--];
            if(j>=0)
            x+=arr2[j--];
            x+=add;
            if(x>=2)
            {
                ans.push_back(x-2);
                add=-1;
            }
            else if(x>=0)
            {
                ans.push_back(x);
                add=0;
            }
            else
                {
                    ans.push_back(1);
                    add=1;
                }
        }
        while (ans.size() > 1 && ans.back() == 0) {
            ans.pop_back();
        }
        reverse(ans.begin(),ans.end());
        return ans;
    }
};

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/adding-two-negabinary-numbers/
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

你可能感兴趣的:(c++,leetcode,算法)