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位。
第一个通过为答案解法 第二个通过为作者自己解法。
ac代码
c++:
自己思路
#include<iostream>
#include<bits/stdc++.h>
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/
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。