问题:

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. 数据库性能分析 慢查询 profile工具

  2. Vue中如何将数据传递到下一个页面(超级简单哒)

    先展示效果:注意URL中值是有变化的 一:在goodslist.vue文件夹绑定 <router-link :to="'/goodsinfo/'+subitem.artID" ...

  3. Mybatis Plugin(拦截器)的开发

    1.Plugin   MyBatis 允许使用插件来拦截的方法调用包括: • Executor (update, query, flushStatements, commit, rollback, g ...

  4. [洛谷P4315] 月下”毛景“树

    题目链接: 点我 题目分析: 树剖.将边权下放到下方点上(为什么要选深度更深的点?一个父亲可能对应多个儿子,但一个儿子只有一个父亲,即可以保证每个点只保存一条边权)成为经典点权+树剖裸题 注意链计算时 ...

  5. Django -- 权限初识

    待 需求分析-场景 假设需要为公司设计一个人员管理系统,并为各级领导及全体员工分配系统登录账号.有如下几个要求: 1.权限等级不同 公司领导登录后可查看所有员工的信息,部门领导登陆后之可查看本部门员工 ...

  6. (转)Linux基础知识学习

    Linux基础知识学习 原文:http://blog.csdn.net/ye_wei_yang/article/details/52777499 一.Linux的磁盘分区及目录 Linux的配置是通过 ...

  7. (转)linux下od命令的使用

    linux下od命令的使用 原文:http://blog.csdn.net/shylock_backer/article/details/46473283 名称:od作用:格式化输出文件中的数据提要: ...

  8. 疯狂使用 leancloud (投稿文章)

    疯狂使用 leancloud 本文章是投稿文章,已在 leancloud 微信公众号发表. 这里是原文,内容有调整. 3年,从工程师到创始人 觉得不错可以点这里进行 leancloud 注册 项目背景 ...

  9. Jquery4

    w3s例子http://www.w3school.com.cn/jquery/event_keyup.asp Jquery插件 http://www.cnblogs.com/afuge/archive ...

  10. 在开发第一个Android应用之前需要知道的5件事:

    你能否详细讲述一下,在开发Android应用过程中每一阶段要用到的技能和编程语言? 建立一个Android应用程序可以归结为两个主要技能/语言:Java和Android系统.Java是Android的 ...