【Leetcode】1073. Adding Two Negabinary Numbers

题目地址:

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 0ai2,变成标准的 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 0bi<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=1c=0则需要进位,如果 c ≥ 2 c\ge 2 c2(此时 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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值