LeetCode //C - 67. Add Binary

67. Add Binary

Given two binary strings a and b , return their sum as a binary string.

Example 1:

Input: a = "11", b = "1"
Output: "100"

Example 2:

Input: a = "1010", b = "1011"
Output: "10101"

Constraints:
  • 1 < = a . l e n g t h , b . l e n g t h < = 1 0 4 1 <= a.length, b.length <= 10^4 1<=a.length,b.length<=104
  • a and b consist only of '0' or '1' characters.
  • Each string does not contain leading zeros except for the zero itself.

From: LeetCode

Link: 67. Add Binary


Solution:

Ideas:
  1. Determine the Lengths: The lengths of the input strings a and b are determined using strlen.

  2. Allocate Memory: Memory is dynamically allocated for the result string, which must be long enough to hold the sum of the two binary strings plus a possible carry bit at the beginning and a null terminator at the end.

  3. Initialize Result: The allocated result string is initialized with '0's to prepare for the addition operation. This also handles edge cases where the input strings are "0".

  4. Perform Binary Addition:

  • Starting from the rightmost bit (least significant bit) of both strings, each bit is added along with any carry from the previous addition.
  • The sum of the two bits and the carry is computed. The resulting bit (either '0' or '1') is stored in the corresponding position in the result string, and the carry (either 0 or 1) is updated for the next iteration.
  • The loop continues, moving left through the strings until all bits have been processed.
  1. Handle Final Carry: After the loop, if there is a remaining carry, it is placed at the beginning of the result string.

  2. Adjust Result:

  • If there is no carry and the result starts with '0', this leading '0' is unnecessary (except in the case where the result is actually "0"), so it is removed. This is done by creating a copy of the string starting from result[1] and freeing the original result.
  • If there is a carry or the result does not start with '0', the result is returned as is.
Code:
c 复制代码
char* addBinary(char* a, char* b) {
    int lengthA = strlen(a);
    int lengthB = strlen(b);
    int maxLen = lengthA > lengthB ? lengthA : lengthB;
    char* result = (char*)malloc(maxLen + 2); // +1 for possible carry, +1 for '\0'
    
    if (result == NULL) {
        return NULL; // Handle allocation failure if needed
    }
    
    // Initialize the result with '0's to handle the case where a and b are "0"
    for (int i = 0; i < maxLen + 2; i++) {
        result[i] = '0';
    }
    
    int carry = 0; // Initialize the carry
    result[maxLen + 1] = '\0'; // Null-terminate the result
    int i = lengthA - 1;
    int j = lengthB - 1;
    int k = maxLen; // Start from the end of the result

    // Add each bit from right to left
    while (i >= 0 || j >= 0 || carry) {
        int sum = carry;
        if (i >= 0) {
            sum += a[i] - '0'; // Convert from char to int and add to sum
            i--;
        }
        if (j >= 0) {
            sum += b[j] - '0'; // Convert from char to int and add to sum
            j--;
        }
        carry = sum / 2; // Update carry
        result[k] = (sum % 2) + '0'; // Determine the bit to store as char
        k--;
    }

    // Check if there is a carry that used the extra space at the beginning
    if (carry) {
        result[0] = '1';
        return result;
    } else {
        // If the first character is '0' and there was no carry, we need to skip it
        if (result[0] == '0') {
            char* shifted_result = strdup(result + 1);
            free(result);
            return shifted_result;
        } else {
            // If the first character is not '0', we just return the result as is
            return result;
        }
    }
}
相关推荐
苏言の狗14 分钟前
小R的并集大小期望计算 | 蛮力
数据结构·算法
BineHello20 分钟前
MPC用优化求解器 - 解决无人机轨迹跟踪
算法·矩阵·自动驾驶·动态规划·无人机
誓约酱23 分钟前
(每日一题) 力扣 14 最长公共前缀
算法·leetcode·职场和发展
南玖yy42 分钟前
C语言柔性数组深度解析:动态内存管理的艺术
c语言·开发语言·柔性数组
冠位观测者1 小时前
【Leetcode 每日一题 - 补卡】2070. 每一个查询的最大美丽值
数据结构·算法·leetcode
誓约酱1 小时前
(每日一题) 力扣 860 柠檬水找零
linux·c语言·c++·算法·leetcode·职场和发展
地平线开发者1 小时前
手把手基于 MINI 数据集带你做一次板端精度评估
算法·自动驾驶
詹天佐1 小时前
ICCE 数字车钥匙介绍
人工智能·算法
ak啊1 小时前
记忆化(Memoization)
算法
moonless02222 小时前
【Python】你还不了解数据结构与算法?
数据结构·算法·编程语言