leetcode链接:
1073. 负二进制数相加
本来想着是先把两个数转换为十进制求和,然后再转换为负二进制数,但是发现将两个数相加时结果会溢出,所以只能换一种方式
和大数加法类似,只不过注意三个地方,如果当前数位大于等于2,那么令进位等于-1,并且令当前数位减2,如果当前数位小于0(等于-1),那么令进位等于1,令当前数位等于0;最后将当前数位添加到arraylist中,可以参考官方题解;
另外不能包含前导0,所以要把前导零移除,否则还是没法通过所有样例
class Solution {
public int[] addNegabinary(int[] arr1, int[] arr2) {
//用一个list保存结果
ArrayList<Integer> list = new ArrayList<Integer>();
//进位信息
int carry = 0;
int i = arr1.length - 1;
int j = arr2.length - 1;
while(i >= 0 || j >= 0 || carry != 0){
//当前数位的结果
int x = carry;
if(i >= 0){
x += arr1[i--];
}
if(j >= 0){
x += arr2[j--];
}
if(x >= 2){
carry = -1;
x -= 2;
}else if(x < 0){
carry = 1;
x = 1;
}else{
carry = 0;
}
//将当前数位添加到list中
list.add(x);
}
//移除前导0
while(list.size() > 1 && list.get(list.size() - 1) == 0){
list.remove(list.size() - 1);
}
int[] arr = new int[list.size()];
for(i = 0; i < arr.length; i++){
arr[i] = list.get(arr.length - 1 - i);
}
return arr;
}
}