1073. Adding Two Negabinary Numbers

题解

负二进制两个数相加,有两个地方需要注意:

  1. 穷举计算出负二进制的进位法则,双进位

1073. Adding Two Negabinary Numbers - 图1
1073. Adding Two Negabinary Numbers - 图2
1073. Adding Two Negabinary Numbers - 图3

  1. 解决无穷循环的问题。
  • 我们用carry1记录正常进位,carry2记录跳跃进位,如果连续有两位双进位的情况,会导致出现carry1=2,carry2=1的情况。根据进位法则, carry1=2表示需要继续进位,会无限出现carry1=2,carry2=1的情况。由于我们是有限数相加,不会出现无限循环的情况,因此我们来探讨carry1=2和carry2=1是否可以抵消。
  • 由下面的数学公式可知,carry1=2可以和carry2=1抵消,因此加上特殊判断来解决无限循环问题。

1073. Adding Two Negabinary Numbers - 图4

代码

  1. class Solution {
  2. public:
  3. vector<int> addNegabinary(vector<int>& a, vector<int>& b) {
  4. reverse(a.begin(), a.end());
  5. reverse(b.begin(), b.end());
  6. vector<int> c;
  7. int carry1 = 0, carry2 = 0;
  8. for (int i = 0; i < a.size() || i < b.size() || carry1 || carry2; i ++) {
  9. if (carry1 == 2 && carry2 == 1) {
  10. carry1 = 0;
  11. carry2 = 0;
  12. }
  13. int res = carry1;
  14. carry1 = carry2;
  15. carry2 = 0;
  16. if (i < a.size()) {
  17. res += a[i];
  18. }
  19. if (i < b.size()) {
  20. res += b[i];
  21. }
  22. c.push_back(res % 2);
  23. if (res >= 2) {
  24. carry1 += 1;
  25. carry2 += 1;
  26. }
  27. }
  28. while (c.size() > 1 && c.back() == 0) {
  29. c.pop_back();
  30. }
  31. reverse(c.begin(), c.end());
  32. return c;
  33. }
  34. };