问题:

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. 基于Vue的省市区三级联动插件

    官网地址:https://distpicker.uine.org/ 安装: npm install v-distpicker --save 局部注册: import VDistpicker from ...

  2. 正确使用Enum的FlagsAttribute

    正确使用Enum的FlagsAttribute FlagsAttribute 标志枚举对象的值可以包括多个枚举成员,每个成员代表枚举值中的一个位域 使用步骤 添加标记[Flags] 用 2 的幂(即 ...

  3. PHP函数生成随机数

    通常情况下,当我们要生成一个随机字符串时,总是先创建一个字符池,然后用一个循环和mt_rand()或rand()生成php随机数,从字符池中随机选取字符,最后拼凑出需要的长度,代码如下: <?p ...

  4. 判断字符串string是数字、json结构、xml结构

    import org.json.JSONException; import org.json.JSONObject; import org.dom4j.DocumentException; impor ...

  5. 终于有人把P2P、P2C、O2O、B2C、B2B、C2C的区别讲透了!还有许多其它类别的类型分享

    平时在看招聘时,经常看到我们是什么B2C电子商务网站,但是一直不知是啥意思,今天在WEB开发者上面看到这篇文章,就是知道了个所以然,以记录分享. P2P.P2C .O2O .B2C.B2B. C2C, ...

  6. http://circles.arenaofthemes.com/

    http://pan.baidu.com/share/link?shareid=492277&uk=637823677 http://circles.arenaofthemes.com/ ht ...

  7. mysqldatadir 转移

    当mysql data路径与原始目录不一致时 ,请在mysql 安装目录下my-default.ini 进行设置,取消对应#注释的地址,设置新地址,保存,重新启动,即可. 从网上各种搜索啊,各种尝试, ...

  8. SQL Server Sleeping会话占用内存资源浅析?

      在SQL Server中,会话的状态有运行(Running).睡眠(Sleeping).休眠(Dormant).Preconnect 等状态,有时候你会在数据库中看到很多会话处于睡眠(Sleepi ...

  9. BZOJ 4563: [Haoi2016]放棋子

    Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 389  Solved: 248[Submit][Status][Discuss] Descriptio ...

  10. 在CesiumVR基础上实现3D左右立体视觉

    整体思路 在VR模块的基础上调整视差,使其随距离发生变化: 左右分屏时,需要将左右屏的横向进行1/2压缩:这是因为3D-TV在对左右格式影像进行合并时,会进行拉伸: 左屏幕的相机相对于原来的(右屏)相 ...