给出基数为 -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 组成的数组。
示例 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]
都是0
或1
arr1
和arr2
都没有前导0
解题思路
本题为负二进制相加,相比于二进制相加,进位值的范围从{0,1}变成了{-1,0,1},sum范围从{0,1,2,3}变成了{-1,0,1,2,3},具体如下:
- 当sum=0,1时,第i位的结果即为sum,进位值为0;
- 当sum=2,3时,第i位的结果应为sum-2,进位值为-1;
- 当sum=-1时,第i为的结果应为1,进位值为1。
最后去除前导零,再将答案反转即可得到最终答案。
完整代码
public static int[] addNegabinary(int[] arr1, int[] arr2) {
int a1=arr1.length-1,a2=arr2.length-1;
List<Integer> list = new ArrayList<Integer>();
int t = 0;
while (a1>-1 || a2>-1 || t!=0){
int sum = t;
if (a1>=0){
sum += arr1[a1];
}
if (a2>=0){
sum += arr2[a2];
}
if (sum==0||sum==1){
list.add(sum);
t = 0;
}
else if (sum>=2){
list.add(sum-2);
t = -1;
}
else{
list.add(1);
t = 1;
}
--a1;
--a2;
}
while (list.size() > 1 && list.get(list.size() - 1) == 0) {
list.remove(list.size() - 1);
}
int[] arr = new int[list.size()];
for (int i=0;i<arr.length;i++){
arr[i] = list.get(list.size()-(i+1));
}
return arr;
}