题目地址:
https://leetcode.com/problems/adding-two-negabinary-numbers/description/
给定两个数组 A A A和 B B B,分别代表一个 − 2 -2 −2进制的数,最右边的是 ( − 2 ) 0 (-2)^0 (−2)0的系数,向左依次是 ( − 2 ) 1 , ( − 2 ) 2 , . . . (-2)^1,(-2)^2,... (−2)1,(−2)2,...的系数(系数是 0 0 0或 1 1 1)。求它们的和,并返回 − 2 -2 −2进制的数组形式。
首先两个数组右对齐的话是可以加起来的,所以问题就转化为怎么将一个形如 x = a 0 ( − 2 ) 0 + a 1 ( − 2 ) 1 + . . . x=a_0(-2)^0+a_1(-2)^1+... x=a0(−2)0+a1(−2)1+...,其中 0 ≤ a i ≤ 2 0\le a_i\le 2 0≤ai≤2,变成标准的 x = b 0 ( − 2 ) 0 + b 1 ( − 2 ) 1 + . . . x=b_0(-2)^0+b_1(-2)^1+... x=b0(−2)0+b1(−2)1+...,其中 0 ≤ b i < 2 0\le b_i<2 0≤bi<2的形式。考虑已经计算到 c ( − 2 ) k c(-2)^k c(−2)k的情形,如果 c c c不是偶数,那这一位的最终值一定是 1 1 1,否则一定是 0 0 0。如果 c ≠ 1 ∧ c ≠ 0 c\ne 1\land c\ne 0 c=1∧c=0则需要进位,如果 c ≥ 2 c\ge 2 c≥2(此时 c = 2 c=2 c=2或 3 3 3),则 ( − 2 ) k + 1 (-2)^{k+1} (−2)k+1的系数要减 1 1 1;如果 c < 0 c<0 c<0(此时 c = − 1 c=-1 c=−1),则 ( − 2 ) k + 1 (-2)^{k+1} (−2)k+1的系数要加 1 1 1( − ( − 2 ) k = ( − 2 ) k + ( − 2 ) k + 1 -(-2)^k=(-2)^k+(-2)^{k+1} −(−2)k=(−2)k+(−2)k+1)。最后要记得去掉开头 0 0 0。代码如下:
class Solution {
public:
vector<int> addNegabinary(vector<int>& a1, vector<int>& a2) {
if (a1.size() < a2.size()) swap(a1, a2);
for (int i = a1.size() - 1, j = a2.size() - 1; i >= 0 && j >= 0; i--, j--)
a1[i] += a2[j];
vector<int> res;
for (int i = a1.size() - 1, t = 0; i >= 0 || t; i--) {
if (i >= 0) t += a1[i];
res.push_back(t & 1);
t = -(t >> 1);
}
while (res.size() > 1 && !res.back()) res.pop_back();
reverse(res.begin(), res.end());
return res;
}
};
时间复杂度 ( max { l A , l B } ) (\max\{l_A,l_B\}) (max{lA,lB}),空间 O ( 1 ) O(1) O(1)。