作者:小迅
链接:https://leetcode.cn/problems/adding-two-negabinary-numbers/solutions/2274400/mo-ni-zhu-shi-chao-ji-xiang-xi-by-xun-ge-g3zo/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
题目
思路
我们遍历两个数组,从最低位开始,记两个数组当前位的数字为 a 和 b,进位为 c,三个数相加的结果为 x。
- 如果 x ≥ 2 ,那么将 x 减去 2,并向高位进位 −1。即逢 2 进负 1。
- 如果 x = −1 ,将 x 置为 1,并向高位进位 1。
- 都不是的话,x不处理,进位为 0
然后,我们将 x 加入到答案数组中,然后继续处理下一位。
遍历结束后,去除答案数组中末尾的 0,并将数组反转,即可得到最终的答案。
代码
void reverse(int *arr, int left, int right) {//翻转数组元素
while (left < right) {
int tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
left++;
right--;
}
}
int* addNegabinary(int* arr1, int arr1Size, int* arr2, int arr2Size, int* returnSize){
int i = arr1Size - 1, j = arr2Size - 1;
int *ans = (int *)calloc(arr1Size + arr2Size + 1, sizeof(int));
int pos = 0;//初始化变量
for (int c = 0; i >= 0 || j >= 0 || c; --i, --j) {
int a = i < 0 ? 0 : arr1[i];
int b = j < 0 ? 0 : arr2[j];//防止数组溢出
int x = a + b + c;//加法
if (x >= 2) {//情况一
x -= 2;
c = -1;
} else if (x == -1) {//情况二
x = 1;
c = 1;
} else {//情况三
c = 0;
}
ans[pos++] = x;//加入数组
}
while (pos > 1 && ans[pos - 1] == 0) {//去除0
pos--;
}
*returnSize = pos;
reverse(ans, 0, pos - 1);//翻转
return ans;
}
作者:小迅
链接:https://leetcode.cn/problems/adding-two-negabinary-numbers/solutions/2274400/mo-ni-zhu-shi-chao-ji-xiang-xi-by-xun-ge-g3zo/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。