LeetCode·每日一题·1073. 负二进制数相加·模拟

作者:小迅
链接: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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

猜你喜欢

转载自blog.csdn.net/m0_64560763/article/details/130741751