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;
}