LeetCode //C - 1073. Adding Two Negabinary Numbers

1073. Adding Two Negabinary Numbers

Given two numbers arr1 and arr2 in base -2, return the result of adding them together.

Each number is given in array format: as an array of 0s and 1s, from most significant bit to least significant bit. For example, arr = 1,1,0,1 represents the number (-2)^3 + (-2)^2 + (-2)^0 = -3. A number arr in array, format is also guaranteed to have no leading zeros: either arr == 0 or arr0 == 1.

Return the result of adding arr1 and arr2 in the same format: as an array of 0s and 1s with no leading zeros.

Example 1:

Input: arr1 = 1,1,1,1,1, arr2 = 1,0,1

Output: 1,0,0,0,0

Explanation: arr1 represents 11, arr2 represents 5, the output represents 16.

Example 2:

Input: arr1 = 0, arr2 = 0

Output: 0

Example 3:

Input: arr1 = 0, arr2 = 1

Output: 1

Constraints:
  • <= arr1.length, arr2.length <= 1000
  • arr1i and arr2i are 0 or 1
  • arr1 and arr2 have no leading zeros

From: LeetCode

Link: 1073. Adding Two Negabinary Numbers


Solution:

Ideas:

In base -2, each position represents powers of (-2)^k, so:

  • Carry must flip sign compared to normal binary
  • This formula automatically handles cases like:
    • sum = 2 → bit = 0, carry = -1
    • sum = -1 → bit = 1, carry = 1
Code:
c 复制代码
int* addNegabinary(int* arr1, int arr1Size, int* arr2, int arr2Size, int* returnSize) {
    int i = arr1Size - 1, j = arr2Size - 1;
    int carry = 0;

    int maxSize = arr1Size + arr2Size + 5;
    int* res = (int*)malloc(sizeof(int) * maxSize);
    int k = 0;

    while (i >= 0 || j >= 0 || carry != 0) {
        int sum = carry;

        if (i >= 0) sum += arr1[i--];
        if (j >= 0) sum += arr2[j--];

        res[k++] = sum & 1;           // result bit
        carry = -(sum >> 1);          // special carry for base -2
    }

    // remove leading zeros
    while (k > 1 && res[k - 1] == 0) {
        k--;
    }

    // reverse result
    int* ans = (int*)malloc(sizeof(int) * k);
    for (int p = 0; p < k; p++) {
        ans[p] = res[k - 1 - p];
    }

    free(res);

    *returnSize = k;
    return ans;
}
相关推荐
JieE2129 小时前
LeetCode 101. 对称二叉树|JS 递归 + 迭代双解法,彻底搞懂镜像判断
javascript·算法
JieE2121 天前
LeetCode 56. 合并区间|超清晰 JS 图解思路,面试高频区间题
javascript·算法·面试
Jack202 天前
HarmonyOS开发中错误处理策略:网络异常统一处理
算法
小小杨树2 天前
读懂色彩:拍照调色不再难
算法·计算机视觉·配色
JieE2122 天前
LeetCode 226. 翻转二叉树|JS 递归超详细拆解,二叉树入门经典题
javascript·算法
JieE2122 天前
LeetCode 104. 二叉树的最大深度|递归思路超详细拆解
javascript·算法
vivo互联网技术3 天前
CVPR 2026 | 全新强化学习框架 BeautyGRPO:重塑真实人像
算法·大模型·cvpr·影像
Darling噜啦啦3 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
用户497863050733 天前
(一)小红的数组操作
算法·编程语言