代码训练LeetCode(12)二进制求和

这篇具有很好参考价值的文章主要介绍了代码训练LeetCode(12)二进制求和。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

代码训练(12)LeetCode之二进制求和


Author: Once Day Date: 2024年3月14日

一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦…

漫漫长路,有人对你微笑过嘛…

全系列文章可参考专栏: 十年代码训练_Once-Day的博客-CSDN博客

参考文章:

  • 67. 二进制求和 - 力扣(LeetCode)
  • 力扣 (LeetCode) 全球极客挚爱的技术成长平台

1. 原题

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

例如,输入a=111b=1,输出结果为1000

2. 分析

二进制加法本质上和十进制加法相似,只不过它只包含两个数字:0和1。在二进制加法中,我们需要考虑以下几种情况:

  1. 0 + 0 = 0
  2. 1 + 0 = 1 或者 0 + 1 = 1
  3. 1 + 1 = 10 (这里1需要进位)

我们可以使用一个指针从两个字符串的末尾开始向前遍历,模拟手工加法的过程。同时,我们需要一个变量carry来记录进位。对于每一对位,我们需要计算它们的和再加上carry,然后更新carry。如果carry在处理完所有位之后仍然为1,我们需要在结果前面再加上一个’1’。

分析步骤

  1. 对齐字符串:确保两个字符串等长,可以在较短的字符串前面补0。
  2. 初始化进位carry为0。
  3. 从字符串的最后一个字符开始,向前遍历。
  4. 对每一位进行加法运算,并更新进位carry
  5. 如果遍历完后carry仍为1,则在结果前面添加一个’1’。
  6. 返回结果字符串。

例如,假设我们有两个二进制字符串a = "1010"b = "1011"

  1. 结果初始化为空字符串result = "",进位carry = 0
  2. 从最右边开始,0 + 1 = 1,result = "1"carry = 0
  3. 接着,1 + 1 = 10,result = "01"carry = 1
  4. 再次,0 + 0 + carry(1) = 1,result = "101"carry = 0
  5. 最后,1 + 1 + carry(0) = 10,result = "0101"carry = 1
  6. 因为carry为1,所以在result前面加上一个’1’,得到result = "10101"

性能优化关键点

  1. 内存管理:由于我们需要动态地创建一个新字符串来保存加法结果,使用malloc进行内存分配,因此在使用完毕后,应当使用free释放内存,以避免内存泄露。
  2. 字符串操作:在进行字符串操作时,我们计算了字符串长度,并且从后向前进行遍历,避免了不必要的字符串复制或移动,这有助于提高代码的执行效率。
3. 代码实现
char *addBinary(char *a, char *b) {
    int len_a = strlen(a);
    int len_b = strlen(b);
    int max_len = len_a > len_b ? len_a : len_b;

    // 结果字符串长度可能会比输入长1,所以需要加2(一个额外的字符和一个结束符'\0')
    char *result = (char *)malloc(max_len + 2);

    int carry = 0; // 进位
    int i = len_a - 1, j = len_b - 1, k = max_len;

    result[k + 1] = '\0'; // 设置字符串结束符

    while (i >= 0 || j >= 0 || carry) {
        int sum = carry;
        if (i >= 0) sum += a[i--] - '0'; // 将字符转换为数字并加到sum
        if (j >= 0) sum += b[j--] - '0';
        result[k--] = (sum % 2) + '0'; // 计算当前位的结果,并将数字转换为字符
        carry = sum / 2; // 计算新的进位
    }

    if (carry) {
        result[k--] = '1';
    }

    return result + k + 1; // 返回正确的结果字符串起始位置
}

这段代码实现了一个函数 addBinary,用于将两个二进制字符串 ab 相加,并返回相加的结果。函数的主要逻辑如下:

  1. 计算输入字符串 ab 的长度,分别存储在变量 len_alen_b 中。

  2. 确定结果字符串的最大长度 max_len,取 len_alen_b 的较大值。

  3. 动态分配结果字符串 result 的内存空间,长度为 max_len + 2。额外的两个字符是为了存储可能的进位和字符串结束符 '\0'

  4. 初始化变量 carry 为 0,表示进位;ijk 分别表示字符串 abresult 的当前位置,初始值分别为 len_a - 1len_b - 1max_len

  5. 设置结果字符串的结束符 '\0'

  6. 使用 while 循环从右到左遍历字符串 ab,同时考虑进位的情况:

    • 计算当前位的和 sum,初始值为进位 carry
    • 如果 ij 还没有越界,将对应位置的字符转换为数字并加到 sum 中。
    • 计算当前位的结果,即 sum % 2,并将数字转换为字符存储在 result[k] 中。
    • 计算新的进位 carry,即 sum / 2
    • 更新指针 ijk 的位置。
  7. 循环结束后,如果还有进位,将进位添加到结果字符串的最高位。

  8. 返回结果字符串的正确起始位置,即 result + k + 1

这个函数通过动态分配内存的方式,将两个二进制字符串相加,并返回相加的结果。时间复杂度为 O(max(len_a, len_b)),空间复杂度为 O(max(len_a, len_b))。

运行结果如下所示(仅供参考):

代码训练LeetCode(12)二进制求和,CS小白之路,#  十年代码训练,# C语言,leetcode,linux,c语言

4. 总结

这个题目测试了对二进制加法的理解和字符串操作。为了提升这些方面的编程能力,可以:

  • 理解二进制运算:熟悉计算机是如何处理二进制数据的,尤其是二进制的算术运算。
  • 练习字符串处理:操作字符串是编程中的常见任务。多练习相关的题目能够提高在处理字符串时的熟练度。






代码训练LeetCode(12)二进制求和,CS小白之路,#  十年代码训练,# C语言,leetcode,linux,c语言

Once Day

也信美人终作土,不堪幽梦太匆匆......

如果这篇文章为您带来了帮助或启发,不妨点个赞👍和关注,再加上一个小小的收藏⭐!

(。◕‿◕。)感谢您的阅读与支持~~~文章来源地址https://www.toymoban.com/news/detail-841714.html

到了这里,关于代码训练LeetCode(12)二进制求和的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • LeetCode_字符串_简单_67.二进制求和

    给你两个二进制字符串 a 和 b,以二进制字符串的形式返回它们的和。 示例 1: 输入:a = “11”, b = “1” 输出:“100” 示例 2: 输入:a = “1010”, b = “1011” 输出:“10101” 提示: 1 = a.length, b.length = 10 4 a 和 b 仅由字符 ‘0’ 或 ‘1’ 组成 字符串如果不是 “0” ,就不含前

    2024年02月09日
    浏览(45)
  • 67. 二进制求和

    题目链接:力扣 解题思路:模拟十进制中的列竖式方法进行计算,逢二进一,因为高位在前,低位在后,两个二进制长度不一定相等,可以取两者长度的较大值,从后面开始遍历两个字符串,当较短的字符串遍历完后,剩下的相加过程中,较短的字符串在加法运算中贡献为

    2024年02月15日
    浏览(47)
  • 力扣67. 二进制求和算法

    这道题需要,给你两个字符串比如 答案是:\\\"10101\\\" 然后需要你给出计算结果,那么我们很容易想到两种做法 1. 调库做法:直接转化为整数,然后用内置函数做进制转换直接计算出结果 2. 计算做法:将十进制思维移植过来,对每一位加并且做carry操作,最后得出结果 笔者最初

    2024年01月16日
    浏览(45)
  • 【算法题】67. 二进制求和

    给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。 示例 1: 输入:a = \\\"11\\\", b = \\\"1\\\" 输出:\\\"100\\\" 示例 2: 输入:a = \\\"1010\\\", b = \\\"1011\\\" 输出:\\\"10101\\\" 提示: 1 = a.length, b.length = 10^4 a 和 b 仅由字符 \\\'0\\\' 或 \\\'1\\\' 组成 字符串如果不是 \\\"0\\\" ,就不含前导零

    2024年01月23日
    浏览(76)
  • 力扣:67. 二进制求和(Python3)

    给你两个二进制字符串  a  和  b  ,以二进制字符串的形式返回它们的和。 来源:力扣(LeetCode) 链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 示例 1: 输入:a = \\\"11\\\", b = \\\"1\\\" 输出:\\\"100\\\" 示例 2: 输入:a = \\\"1010\\\", b = \\\"1011\\\" 输出:\\\"10101\\\" 转成十进制相加,再转回二进

    2024年02月12日
    浏览(33)
  • Python每日一练(20230420) 数组逐位判断、交错字符串、二进制求和

    目录 1. 数组逐位判断  🌟 2. 交错字符串  🌟🌟 3. 二进制求和  🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C++每日一练 专栏 Java每日一练 专栏 比如有以下数组: a1: 1,0,0,1,0,0,0,1 a2: 0,0,0,0,1,1,1,1 a3: 0,1,0,1,0,1,0,0 a4: 1,0,1,1,1,1,0,0 a5: ....... 抓取三个数

    2024年02月15日
    浏览(49)
  • leetcode-颠倒二进制位

    190. 颠倒二进制位 题解: 我们可以使用位运算来解决这个问题。具体步骤如下: 初始化一个变量res为0,用于存储颠倒后的二进制位。 循环32次,每次将n的最低位取出,并将其添加到res的最高位上。 将n右移一位,将res左移一位。 返回res作为最终结果。

    2024年01月25日
    浏览(78)
  • 【第36天】组合位运算训练 | 二进制思想

    本文已收录于专栏 🌸《Java入门一百例》🌸

    2024年02月01日
    浏览(37)
  • leetcode: 2861. 最大二进制奇数

    给你一个 二进制 字符串  s  ,其中至少包含一个  \\\'1\\\'  。 你必须按某种方式 重新排列 字符串中的位,使得到的二进制数字是可以由该组合生成的 最大二进制奇数 。 以字符串形式,表示并返回可以由给定组合生成的最大二进制奇数。 注意 返回的结果字符串 可以 含

    2024年03月13日
    浏览(54)
  • FPGA自学之路12(二进制转换8421bcd码)

    如图所示,先看原理。1110_1010对应的十进制是3位,所以bcd码有12位。先12位bcd全部取0,然后二进制码左移一位,从个位开始判断是否大于4,不大于4继续左移。大于4就加3(0011),然后再左移一位,然后再进行判断,直至所有二进制码全部左移完。 框图如下 这里输入的二进制码

    2024年02月11日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包