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;
        }
    }
}
相关推荐
cici1587431 分钟前
大规模MIMO系统中Alamouti预编码的QPSK复用性能MATLAB仿真
算法·matlab·预编码算法
历程里程碑39 分钟前
滑动窗口---- 无重复字符的最长子串
java·数据结构·c++·python·算法·leetcode·django
2501_940315262 小时前
航电oj:首字母变大写
开发语言·c++·算法
CodeByV2 小时前
【算法题】多源BFS
算法
TracyCoder1232 小时前
LeetCode Hot100(18/100)——160. 相交链表
算法·leetcode
浒畔居2 小时前
泛型编程与STL设计思想
开发语言·c++·算法
独处东汉3 小时前
freertos开发空气检测仪之输入子系统结构体设计
数据结构·人工智能·stm32·单片机·嵌入式硬件·算法
m0_748229993 小时前
ThinkPHP快速入门:从零到实战
c语言·开发语言·数据库·学习
乐迪信息3 小时前
乐迪信息:AI防爆摄像机在船舶监控的应用
大数据·网络·人工智能·算法·无人机
放荡不羁的野指针3 小时前
leetcode150题-滑动窗口
数据结构·算法·leetcode