问题:

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. JS高级学习历程-6

    PHP菜鸟学习历程-6 [闭包案例] 1 闭包创建数组 <!DOCTYPE html> <html lang="en"> <head> < ...

  2. 程序员/开发人员的真实生活 (Gif 多图)

    往工作环境上传东西的时候: 没保存,就关了 IDE 的时候: 凌晨三点调代码的时候: 正则表达式返回了了预期结果的时候: 当老板告诉我,我那一直负责的模块失效了的时候: 刚修复了Bug,我给老板演示的 ...

  3. 湖南大学新生赛C,G,J题解

    C: 思路:做几组数据就基本能发现规律,奇数为-1,偶数为1 代码: #include<cstdio> #include<iostream> #include<cstri ...

  4. (转)Linux下java进程CPU占用率高-分析方法

    Linux下java进程CPU占用率高-分析方法 原文:http://itindex.net/detail/47420-linux-java-%E8%BF%9B%E7%A8%8B?utm_source ...

  5. text-transform 字母的大小写

    text-transform: none   默认 capitalize    每个单词以大写字母开头 uppercase    仅有大写字母 lowercase     无大写字母,仅有小写字母 i ...

  6. Java实现的断点续传功能

    代码中已经加入了注释,需要的朋友可以直接参考代码中的注释.下面直接上功能实现的主要代码: import java.io.File; import java.io.FileNotFoundExcepti ...

  7. 洛谷CF784E Twisted Circuit

    (本题本来可能也就普及难度但是硬生生给评成了一道NOI难度的紫题,有点无语...) 这道题目是一道愚人节题目,本来只有下面的电路图,结果翻译完之后难度就直接没了. ------------ 言归正传, ...

  8. Bootstrap下拉菜单相关

    1.实现普通下拉菜单:.dropdown>button.dropdown-toggle[data-toggle="dropdown"]+ul.dropdown-menu; 2 ...

  9. zTree使用随笔

    最近开发过程中,需要写一个公司人员组织架构的树状图,后来选用了依赖jQuery的zTree插件来实现,主要是该插件功能齐全,性能稳定,个性化编辑方便,遂选用了这个插件.我记录了一下根据自身需求定制化修 ...

  10. zblog去除底部版权信息 “请勿修改或删除主题版权及作者信息”

    场景:使用了免费模板,但底部带作者版权.删除版权信息的代码后访问前台弹窗:请勿修改或删除主题版权及作者信息... 1. 删除版权信息代码 使用notepad++搜索功能,搜索版权信息:如ABC,找到相 ...