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;
        }
    }
}
相关推荐
uhakadotcom1 小时前
Apache Airflow入门指南:数据管道的强大工具
算法·面试·github
跳跳糖炒酸奶1 小时前
第四章、Isaacsim在GUI中构建机器人(2):组装一个简单的机器人
人工智能·python·算法·ubuntu·机器人
绵绵细雨中的乡音2 小时前
动态规划-第六篇
算法·动态规划
程序员黄同学2 小时前
动态规划,如何应用动态规划解决实际问题?
算法·动态规划
march_birds2 小时前
FreeRTOS 与 RT-Thread 事件组对比分析
c语言·单片机·算法·系统架构
小麦嵌入式3 小时前
Linux驱动开发实战(十一):GPIO子系统深度解析与RGB LED驱动实践
linux·c语言·驱动开发·stm32·嵌入式硬件·物联网·ubuntu
斯汤雷3 小时前
Matlab绘图案例,设置图片大小,坐标轴比例为黄金比
数据库·人工智能·算法·matlab·信息可视化
云 无 心 以 出 岫3 小时前
贪心算法QwQ
数据结构·c++·算法·贪心算法
俏布斯3 小时前
算法日常记录
java·算法·leetcode
独好紫罗兰3 小时前
洛谷题单3-P5719 【深基4.例3】分类平均-python-流程图重构
开发语言·python·算法