1073. Adding Two Negabinary Numbers
题解
负二进制两个数相加,有两个地方需要注意:
- 穷举计算出负二进制的进位法则,双进位。
- 解决无穷循环的问题。
- 我们用carry1记录正常进位,carry2记录跳跃进位,如果连续有两位双进位的情况,会导致出现carry1=2,carry2=1的情况。根据进位法则, carry1=2表示需要继续进位,会无限出现carry1=2,carry2=1的情况。由于我们是有限数相加,不会出现无限循环的情况,因此我们来探讨carry1=2和carry2=1是否可以抵消。
- 由下面的数学公式可知,carry1=2可以和carry2=1抵消,因此加上特殊判断来解决无限循环问题。
代码
class Solution {public:vector<int> addNegabinary(vector<int>& a, vector<int>& b) {reverse(a.begin(), a.end());reverse(b.begin(), b.end());vector<int> c;int carry1 = 0, carry2 = 0;for (int i = 0; i < a.size() || i < b.size() || carry1 || carry2; i ++) {if (carry1 == 2 && carry2 == 1) {carry1 = 0;carry2 = 0;}int res = carry1;carry1 = carry2;carry2 = 0;if (i < a.size()) {res += a[i];}if (i < b.size()) {res += b[i];}c.push_back(res % 2);if (res >= 2) {carry1 += 1;carry2 += 1;}}while (c.size() > 1 && c.back() == 0) {c.pop_back();}reverse(c.begin(), c.end());return c;}};
