问题:

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:

 class Solution {
public: vector<int> addNegabinary(vector<int>& arr1, vector<int>& arr2) { //算出值结果逆向回来
//或者从低位算,两个上面退一
vector<int> ret;
if (arr1.size() == && arr2.size() == && arr1[]== && arr2[]==)
{
ret.emplace_back();
return ret;
}
int len;
vector<int> larray;
reverse(arr1.begin(), arr1.end());
reverse(arr2.begin(), arr2.end());
if (arr1.size() < arr2.size())
{
arr2.emplace_back();
arr2.emplace_back();
len = arr1.size(); larray = arr2;
}
else
{
arr1.emplace_back();
arr1.emplace_back();
len = arr2.size();
larray = arr1;
} int carry=;
for (int i = ; i < len; i++)
{
int val = arr1[i] + arr2[i]+carry;
//-1 0 1 2 3
if (val >= )
{
carry = -;
ret.emplace_back(val-);
}
else if (val == -)
{
carry = ;
ret.emplace_back();
}
else
{
carry = ;
ret.emplace_back(val);
}
}
for (int i = len; i < larray.size(); i++)
{
int val = larray[i] + carry;
//-1 0 1 2 3
if (val >= )
{
carry = -;
ret.emplace_back(val - );
}
else if (val == -)
{
carry = ;
ret.emplace_back();
}
else
{
carry = ;
ret.emplace_back(val);
}
}
vector<int> tmp;
reverse(ret.begin(), ret.end());
int zero = ;
for (int i = ; i < ret.size(); i++)
{
if (ret[i] == )
{
zero++;
}
else
{
break;
}
}
for (int i = zero; i < ret.size(); i++)
{
tmp.emplace_back(ret[i]);
}
if (tmp.size() == )
{
tmp.emplace_back();
return tmp;
}
return tmp;
}
};

其他:

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

Leetcode5078. 负二进制数相加的更多相关文章

  1. [Swift]LeetCode1073. 负二进制数相加 | Adding Two Negabinary Numbers

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  2. [LeetCode] Add Binary 二进制数相加

    Given two binary strings, return their sum (also a binary string). For example,a = "11"b = ...

  3. LeetCode Add Binary 两个二进制数相加

    class Solution { public: string addBinary(string a, string b) { if(a==""&&b==" ...

  4. [LeetCode] 67. Add Binary 二进制数相加

    Given two binary strings, return their sum (also a binary string). The input strings are both non-em ...

  5. [LintCode] Add Binary 二进制数相加

    Given two binary strings, return their sum (also a binary string). Have you met this question in a r ...

  6. python 二进制数相加

    def add_binary_nums(x,y): max_len = max(len(x), len(y)) x = x.zfill(max_len) y = y.zfill(max_len) re ...

  7. [LeetCode] Add Strings 字符串相加

    Given two non-negative numbers num1 and num2 represented as string, return the sum of num1 and num2. ...

  8. [LeetCode] 415. Add Strings 字符串相加

    Given two non-negative numbers num1 and num2 represented as string, return the sum of num1 and num2. ...

  9. Network | UDP checksum

    1. 校验和 ICMP,IP,UDP,TCP报头部分都有checksum(检验和)字段.IP 首部里的校验和只校验首部:ICMP.IGMP.TCP和UDP首部中的校验和校验首部和数据. UDP和TCP ...

随机推荐

  1. CC10:访问单个节点的删除

    题目 实现一个算法,删除单向链表中间的某个结点,假定你只能访问该结点. 给定待删除的节点,请执行删除操作,若该节点为尾节点,返回false,否则返回true 解法 这道题并不难,主要是题目中这句话确定 ...

  2. Codeforces 163E(ac自动机、树状数组)

    要点 显然ac自动机的板子就可以暴力一下答案了 为了优化时间复杂度,考虑套路fail树的dfs序.发现本题需要当前这个尾点加上所有祖先点的个数,考虑使用树状数组差分一下,在父点+1,在子树后-1,每次 ...

  3. Codeforces 140E(排列组合、dp)

    要点 主要学到的东西:一个序列染色,相邻不染同色,恰用\(j\)种颜色的1.模式数.2.方案数.3.具体染色数. 从大的思路上来讲:先dp预处理出每一层的模式数:\(f[i][j]\)表示\(i\)个 ...

  4. css中如何设置透明度

    怎样在CSS样式中设置背景的透明度,下面一个具体的实例.把类为box的层设为透明.<div class="box"></div><style>. ...

  5. 基于.NetCore2.1。服务类库采用.Net Standard2.0,兼容.net 4.6.1消息推送服务

    基于.NetCore2.1.服务类库采用.Net Standard2.0,兼容.net 4.6.1消息推送服务 https://www.cnblogs.com/ibeisha/p/weixinServ ...

  6. Roslyn 编译器和RyuJIT 编译器

    Roslyn 编译器 https://msdn.microsoft.com/zh-cn/library/mt162308.aspx https://blogs.msdn.microsoft.com/d ...

  7. MVC3 自定义的错误页

    ASP.NET MVC3中如果配置文件出错了,怎么跳转到自定义的错误页,现在参考网上的档案是说 添加 如下配置文件,并且在路径Views/Shared/下添加Error页面,测试下没有用的,请大家看看 ...

  8. fleet-运行一个全局的单元

    运行一个全局的单元 正如前面所提到的,全局单元是有用的,用于在您的集群中的所有机器上运行一个单元.它不会比一个普通的单元差太多,而是一个新的x-fleet参数称为Global=true.这是一个示例单 ...

  9. 日历插件:Bootstrap的datetimepicker插件

    注意:可以选择性引入 bootstrap.min.css和bootstrap.min.js,引入样式更好控制 option选项 0-hour 1-day 2-month 3-year 4-all ye ...

  10. [选择排序] 时间复杂度O(n^2)

    思路:从未排序的序列中,找到最小的元素,放到序列的起始位置, 再从剩下没排序的里面,找到最小的,放到已经排序的末尾. 原地操作几乎是选择排序的唯一优点,当空间复杂度要求较高时,可以考虑选择排序:实际适 ...