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;
}
相关推荐
大熊背3 分钟前
树莓派相机自动白平衡详解(四)
算法·树莓派·白平衡·isppipeline
一米阳光86616 分钟前
软考(中级)软件设计师核心笔记(9)算法——背包问题
笔记·算法·职场发展·软考·软件设计师·中级职称
晚风醉蝶18 分钟前
1-11-奇偶排序-OddEvenSort
java·数据结构·算法
旖旎夜光24 分钟前
LeetCode 852:山脉数组的峰顶索引(二分查找) —— 题解
数据结构·c++·算法·leetcode·二分查找
不灭的黄金瞳1231 小时前
预处理详解
c语言
小雪崩2 小时前
嵌入式学习 day25:哈希表及排序与查找
linux·c语言·数据结构·学习·排序算法
白露与泡影2 小时前
解密 Pi 的 Harness 工程:Agent 会话如何实现持久化与恢复
java·人工智能·算法
yiqiefeimeng2 小时前
C语言指针难倒90%人?买房比喻让你瞬间开窍
c语言·学习·编程·指针·比喻
caimouse3 小时前
ReactOS 窗口系统分析(5):可见区域与窗口 DC — vis.c + windc.c
c语言·开发语言
happyprince4 小时前
01-整体观-Codex全貌解读(源码)
算法·ai编程