LeetCode力扣_67.二进制求和

67.二进制求和

这道题有几个关键点对基础不牢的同学可能会造成误解,下面分别作说明:

1.num[i] - ‘0’ —> 字符转换成整数
当你从一个代表数字的字符中减去字符 ‘0’,你实际上是在获取该字符代表的数值。这是因为在 ASCII 编码中,数字字符从 ‘0’ 到 ‘9’ 是连续排列的,并且 ‘0’ 的 ASCII 值是 48。因此,例如字符 ‘5’ 的 ASCII 值是 53,当你计算 ‘5’ - ‘0’ 时,相当于 53 - 48,结果是 5,这正是字符 ‘5’ 所代表的整数值。

2.‘0’ + 某个整数 —> 整数转换成字符
当你向字符 ‘0’ 添加一个整数时,你实际上是在 ASCII 表中向前移动了这个整数指定的位置数。这是基于同样的原理:字符 ‘0’ 的 ASCII 值是 48,所以当你加上一个整数,比如 5,结果是 48 + 5 = 53,这在 ASCII 表中对应的字符是 ‘5’。

PS:本道题和我前面写的一道题有异曲同工之处,可以一起学习。
原文链接:https://blog.csdn.net/weixin_48648405/article/details/139976094

#define max(a, b) (a > b ? a : b)  // 定义宏 max,返回两个值中的较大者

char* addBinary(char *a, char *b) {
    int a_len = strlen(a);  // 获取字符串 a 的长度
    int b_len = strlen(b);  // 获取字符串 b 的长度
    
    // 计算结果字符串的长度:最大输入长度 + 1(可能的进位) + 1(字符串结束符)
    int result_len = max(a_len, b_len) + 1 + 1;

    char *result = malloc(sizeof(char) * result_len);  // 分配内存用于存储结果字符串
    result[0] = '0';   // 初始化结果字符串的第一位为 '0',表示默认无进位
    result[result_len - 1] = '\0';  // 设置结果字符串的最后一位为字符串结束符

    int c = 0;  // 初始化进位为 0
    int i = a_len - 1, j = b_len - 1, k = result_len - 2;  // 从字符串末尾开始处理

    // 遍历字符串 a 和 b,逐位相加
    while (i >= 0 || j >= 0) {
        // 获取当前位的值,若索引小于 0 则视为 0
        int a_bit = i >= 0 ? a[i] - '0' : 0;
        int b_bit = j >= 0 ? b[j] - '0' : 0;
        int bit_sum = a_bit + b_bit + c;  // 计算当前位的和,包括进位

        result[k] = '0' + bit_sum % 2;  // 计算当前位的二进制值并存储在结果字符串中

        c = bit_sum / 2;  // 计算新的进位
        --i;  // 移动到 a 的前一位
        --j;  // 移动到 b 的前一位
        --k;  // 移动到结果字符串的前一位
    }

    if (c != 0)  // 如果最后还有进位
        result[k] = '1';  // 在结果字符串的当前位存储 '1'

    // 如果结果字符串的第一位是 '0',则返回指向第二位的指针;否则返回整个结果字符串
    return result[0] == '0' ? result + 1 : result;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值