问题:

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. Java基础笔记(四)——命名规则、数据类型

    标识符即Java程序中需要自定义的名称,如变量名.方法名.类名.包名.工程名等. 标识符的命名规则: 1.可由字母.数字.下划线(_)和美元符($)组成,不能以数字开头. 2.严格区分大小写. 3.不 ...

  2. java基础笔记(三)——main方法

    1.解析public static void main(String[] args)方法 JVM在运行程序时,会首先查找main()方法作为入口,main是JVM识别的特殊方法名. public是权限 ...

  3. Ubuntu 最新设置阿里云更新源

    可将 http://cn.archive.ubuntu.com/ubuntu/ 替换为下列任意服务器: Ubuntu 官方(欧洲,国内较慢,无同步延迟) http://archive.ubuntu.c ...

  4. js 去除字符串空白符

    var a="      123456" varb=a.replace(/(^\s*)/g, "");

  5. Hive进阶_Hive数据查询

    简单查询和fetch task 简单查询:   简单查询的 fetch task 功能,从HDFS拉取,不用map reduce. 前两种配置,当前session有效.修改hive-site.xml永 ...

  6. windows/Linux下设置ASP.Net Core开发环境并部署应用

    10分钟学会在windows/Linux下设置ASP.Net Core开发环境并部署应用 创建和开发ASP.NET Core应用可以有二种方式:最简单的方式是通过Visual Studio 2017 ...

  7. NET Core应用中如何记录和查看日志

    NET Core应用中如何记录和查看日志 日志记录不仅对于我们开发的应用,还是对于ASP.NET Core框架功能都是一项非常重要的功能特性.我们知道ASP.NET Core使用的是一个极具扩展性的日 ...

  8. 转 DataGuard环境搭建 (一主一备一级联)

    DataGuard环境搭建 (一主一备一级联) http://blog.itpub.net/30130773/viewspace-2116985/ 1.--------- primary_role / ...

  9. Spring Boot自动配置原理与实践(一)

    前言 Spring Boot众所周知是为了简化Spring的配置,省去XML的复杂化配置(虽然Spring官方推荐也使用Java配置)采用Java+Annotation方式配置.如下几个问题是我刚开始 ...

  10. HttpServeletRequest

    一.HttpServeletRequest 接口(javax.servlet.http) 定义:public interface HttpServletRequestextends ServletRe ...