目录

1073:负二进制数相加(1806 分)

力扣第 139 场周赛第 3 题

题目

给出基数为 -2 的两个数 arr1arr2,返回两数相加的结果。

数字以 数组形式 给出:数组由若干 0 和 1 组成,按最高有效位到最低有效位的顺序排列。例如,arr = [1,1,0,1] 表示数字 (-2)^3 + (-2)^2 + (-2)^0 = -3数组形式 中的数字 arr 也同样不含前导零:即 arr == [0]arr[0] == 1

返回相同表示形式的 arr1arr2 相加的结果。两数的表示形式为:不含前导零、由若干 0 和 1 组成的数组。

示例 1:

输入:arr1 = [1,1,1,1,1], arr2 = [1,0,1]
输出:[1,0,0,0,0]
解释:arr1 表示 11,arr2 表示 5,输出表示 16 。

示例 2:

输入:arr1 = [0], arr2 = [0]
输出:[0]

示例 3:

输入:arr1 = [0], arr2 = [1]
输出:[1]

提示:

  • 1 <= arr1.length, arr2.length <= 1000
  • arr1[i]arr2[i] 都是 01
  • arr1arr2 都没有前导0

分析

模拟进位加法即可,因为是负进制,所以进位数 carry 要取反。

最后注意要去掉前导0。

解答

1
2
3
4
5
6
7
8
9
def addNegabinary(self, arr1: List[int], arr2: List[int]) -> List[int]:
	res, carry = [], 0
	while arr1 or arr2 or carry:
		a, b = arr1.pop() if arr1 else 0, arr2.pop() if arr2 else 0
		carry, r = divmod(a+b-carry, 2)
		res.append(r)
	while len(res)>1 and res[-1]==0:
		res.pop()
	return res[::-1]

36 ms