力扣67 二进制求和 C语言

题目

给你两个二进制字符串 ab ,以二进制字符串的形式返回它们的和。

示例 1:

复制代码
输入:a = "11", b = "1"
输出:"100"

示例 2:

复制代码
输入:a = "1010", b = "1011"
输出:"10101"

思路

二进制求和需要考虑进位以及把两个数对齐的操作。官方题解中是将两个字符串反转,这样从低下标开始相加其实就是实际的加法过程了。对于进位问题,我原本想的是设一个变量 flag ,然后考虑 a[i] + b[i] + flag 对应的情况,官方题解中以 carry 表示进位,那么每一位的结果实际上是 (carry + a[i] + b[i])%2 ,不需要用 if 进行判断,进位就是 (carry + a[i] + b[i])/2,还挺妙的。如果最后进位不为 0 的话要在末尾加一个 1 ,最后反转结果得到最终答案。 官方题解的代码写的非常简洁,学到了反转字符串和 fmax()函数。

代码

复制代码
void reserve(char* s) {
    int len = strlen(s);
    for (int i = 0; i < len / 2; i++) {
        char t = s[i];
        s[i] = s[len - i - 1], s[len - i - 1] = t;
    }
}

char* addBinary(char* a, char* b) {
    reserve(a);
    reserve(b);

    int len_a = strlen(a), len_b = strlen(b);
    int n = fmax(len_a, len_b), carry = 0, len = 0;
    char* ans = (char*)malloc(sizeof(char) * (n + 2));
    for (int i = 0; i < n; ++i) {
        carry += i < len_a ? (a[i] == '1') : 0;
        carry += i < len_b ? (b[i] == '1') : 0;
        ans[len++] = carry % 2 + '0';
        carry /= 2;
    }

    if (carry) {
        ans[len++] = '1';
    }
    ans[len] = '\0';
    reserve(ans);

    return ans;
}
相关推荐
美丽新科技18 分钟前
【计算机考研(408)- 数据结构】数组和特殊矩阵
数据结构·考研·矩阵
蒟蒻小袁24 分钟前
力扣面试150题--搜索二维矩阵
leetcode·面试·矩阵
lifallen1 小时前
Kafka 如何优雅实现 Varint 和 ZigZag 编码
java·数据结构·分布式·算法·kafka
闪电麦坤951 小时前
数据结构:找出字符串中重复的字符(Finding Duplicates in a String)——使用哈希表
数据结构·算法
风吹落叶花飘荡2 小时前
客流分析核心算法 trajectory_event_analyzer数据结构
网络·数据结构·算法
艾莉丝努力练剑2 小时前
【数据结构与算法】数据结构初阶:详解二叉树(一)
c语言·开发语言·数据结构·学习·链表
zaiyang遇见2 小时前
牛客NC14661 简单的数据结构(deque双端队列)
数据结构·stl·双端队列·c/c++·信息学奥赛·程序设计竞赛
秋说2 小时前
【PTA数据结构 | C语言版】求解二部图最大匹配的匈牙利算法
c语言·数据结构·算法·深度优先·图论
lifallen2 小时前
kafka 日志索引 AbstractIndex
java·数据结构·数据库·分布式·kafka
艾莉丝努力练剑2 小时前
【数据结构与算法】数据结构初阶:详解二叉树(二)——堆
c语言·数据结构·学习·算法·链表