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;
        }
    }
}
相关推荐
满分观察网友z几秒前
从一次手滑,我洞悉了用户输入的所有可能性(3330. 找到初始输入字符串 I)
算法
持梦远方8 分钟前
C 语言基础入门:基本数据类型与运算符详解
c语言·开发语言·c++
YuTaoShao22 分钟前
【LeetCode 热题 100】73. 矩阵置零——(解法二)空间复杂度 O(1)
java·算法·leetcode·矩阵
Heartoxx23 分钟前
c语言-指针(数组)练习2
c语言·数据结构·算法
大熊背37 分钟前
图像处理专业书籍以及网络资源总结
人工智能·算法·microsoft
满分观察网友z41 分钟前
别怕树!一层一层剥开它的心:用BFS/DFS优雅计算层平均值(637. 二叉树的层平均值)
算法
杰克尼2 小时前
1. 两数之和 (leetcode)
数据结构·算法·leetcode
YuTaoShao3 小时前
【LeetCode 热题 100】56. 合并区间——排序+遍历
java·算法·leetcode·职场和发展
二进制person7 小时前
Java SE--方法的使用
java·开发语言·算法
OneQ6667 小时前
C++讲解---创建日期类
开发语言·c++·算法