思路
正常如果看二进制不太好看出来规律,得拆开看
如 [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();
}
}
};