Leetcode5078. 负二进制数相加

问题:

5078. 负二进制数相加

给出基数为 -2 的两个数 arr1 和 arr2,返回两数相加的结果。

数字以 数组形式 给出:数组由若干 0 和 1 组成,按最高有效位到最低有效位的顺序排列。例如,arr = [1,1,0,1] 表示数字 (-2)^3 + (-2)^2 + (-2)^0 = -3。数组形式 的数字也同样不含前导零:以 arr 为例,这意味着要么 arr == [0],要么 arr[0] == 1

返回相同表示形式的 arr1 和 arr2 相加的结果。两数的表示形式为:不含前导零、由若干 0 和 1 组成的数组。

示例:

输入:arr1 = [1,1,1,1,1], arr2 = [1,0,1]
输出:[1,0,0,0,0]
解释:arr1 表示 11,arr2 表示 5,输出表示 16 。

提示:

  1. 1 <= arr1.length <= 1000
  2. 1 <= arr2.length <= 1000
  3. arr1 和 arr2 都不含前导零
  4. arr1[i] 为 0 或 1
  5. arr2[i] 为 0 或 1

链接:https://leetcode-cn.com/contest/weekly-contest-139/problems/adding-two-negabinary-numbers/

分析:

两种做法

1 计算出两个值,相加得到结果,然后还原成-2 的幂的和的形式

2 找到进位规则,然后按照加法进行处理。

由于底数是-2,所以会正负交替,且无论正负,前一个等于后面两个和的-2倍,对应的进位应该是-1,

如果前一位是0,则需要向更前一位借1,相对于2进-1,对应的应该是+1,然后下一位+2

比如:

    1 0 1

+             1

--------------------

       1  1  0 1 0

解释:

最低位1+1,得0,进位-1

第二位0+(-1),需要向是上一位进位1,2+0-1=1 得1

第三位1+1,得0,进位-1

高位省略0,0-1,借位上一位进1,2-1=1

高位1

最终结果1 1 0 1 0,

检验一下,101对应4-0+1=5,1对应1,5+1=6

对应结果11010=16-8+0-2+0=6。

例子中涉及到了进位 0 1 -1这三种情况

AC Code:

  1 class Solution {
  2 public:
  3 
  4 
  5     vector<int> addNegabinary(vector<int>& arr1, vector<int>& arr2) {
  6 
  7         //算出值结果逆向回来
  8         //或者从低位算,两个上面退一
  9         vector<int>  ret;
 10          if (arr1.size() == 1 && arr2.size() == 1 && arr1[0]==0 && arr2[0]==0)
 11         {
 12             ret.emplace_back(0);
 13             return ret;
 14         }
 15         int len;
 16         vector<int> larray;
 17         reverse(arr1.begin(), arr1.end());
 18         reverse(arr2.begin(), arr2.end());
 19         if (arr1.size() < arr2.size())
 20         {
 21             arr2.emplace_back(0);
 22             arr2.emplace_back(0);
 23             len = arr1.size();
 24             
 25             larray = arr2;
 26         }
 27         else
 28         {
 29             arr1.emplace_back(0);
 30             arr1.emplace_back(0);
 31             len = arr2.size();
 32             larray = arr1;
 33         }
 34 
 35         int carry=0;
 36         for (int i = 0; i < len; i++)
 37         {
 38             int val = arr1[i] + arr2[i]+carry;
 39             //-1 0 1 2 3
 40             if (val >= 2)
 41             {
 42                 carry = -1;
 43                 ret.emplace_back(val-2);
 44             }
 45             else if (val == -1)
 46             {
 47                 carry = 1;
 48                 ret.emplace_back(1);
 49             }
 50             else
 51             {
 52                 carry = 0;
 53                 ret.emplace_back(val);
 54             }
 55         }
 56         for (int i = len; i < larray.size(); i++)
 57         {
 58             int val = larray[i] + carry;
 59             //-1 0 1 2 3
 60             if (val >= 2)
 61             {
 62                 carry = -1;
 63                 ret.emplace_back(val - 2);
 64             }
 65             else if (val == -1)
 66             {
 67                 carry = 1;
 68                 ret.emplace_back(1);
 69             }
 70             else
 71             {
 72                 carry = 0;
 73                 ret.emplace_back(val);
 74             }
 75         }
 76         vector<int> tmp;
 77         reverse(ret.begin(), ret.end());
 78         int zero = 0;
 79         for (int i = 0; i < ret.size(); i++)
 80         {
 81             if (ret[i] == 0)
 82             {
 83                 zero++;
 84             }
 85             else
 86             {
 87                 break;
 88             }
 89         }
 90         for (int i = zero; i < ret.size(); i++)
 91         {
 92             tmp.emplace_back(ret[i]);
 93         }
 94       if (tmp.size() == 0)
 95         {
 96             tmp.emplace_back(0);
 97             return tmp;
 98         }
 99         return tmp;
100     }
101 };

其他:

虽然只是个中等,感觉很有意思,底数为负,需要构建新的进位规则,一旦进位规则确定,也就是普通的加减法了

猜你喜欢

转载自www.cnblogs.com/youdias/p/10962487.html