题面:
给出基数为 -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 组成的数组。
示例:
输入:arr1 = [1,1,1,1,1], arr2 = [1,0,1]
输出:[1,0,0,0,0]
解释:arr1 表示 11,arr2 表示 5,输出表示 16 。
提示:
1 <= arr1.length <= 1000
1 <= arr2.length <= 1000
arr1 和 arr2 都不含前导零
arr1[i] 为 0 或 1
arr2[i] 为 0 或 1
题解:
模拟(0(n))
与基数为2的二进制不一样的是,进位是高位减一;
因此此时应该检查数位上是否出现了-1,如果出现了,高位加1将当前位变为1
最后除去前导0
代码:
class Solution { public: vector<int> addNegabinary(vector<int>& arr1, vector<int>& arr2) { reverse(arr1.begin(),arr1.end()); reverse(arr2.begin(),arr2.end()); int n=arr1.size(),m=arr2.size(); if(n<m) arr1.resize(m); else arr2.resize(n); n=max(n,m); vector<int>res(n+2,0); for(int i=0;i<n;i++) { res[i]+=arr1[i]+arr2[i]; res[i+1]-=res[i]/2; res[i]%=2; } for(int i=0;i<n+1;i++) { if(res[i]<0) { res[i]+=2; res[i+1]++; } res[i+1]-=res[i]/2; res[i]%=2; } n+=2; while(n>1&&res[n-1]==0) n--; res.resize(n); reverse(res.begin(),res.end()); return res; } };