返回介绍

Add Binary

发布于 2025-02-22 13:01:35 字数 1685 浏览 0 评论 0 收藏 0

Source

Given two binary strings, return their sum (also a binary string).

For example,
a = "11"
b = "1"
Return "100".

题解

用字符串模拟二进制的加法,加法操作一般使用自后往前遍历的方法,不同位大小需要补零。

Java

public class Solution {
  /**
   * @param a a number
   * @param b a number
   * @return the result
   */
  public String addBinary(String a, String b) {
    if (a == null || a.length() == 0) return b;
    if (b == null || b.length() == 0) return a;

    StringBuilder sb = new StringBuilder();
    int aLen = a.length(), bLen = b.length();

    int carry = 0;
    for (int ia = aLen - 1, ib = bLen - 1; ia >= 0 || ib >= 0; ia--, ib--) {
      // replace with 0 if processed
      int aNum = (ia < 0) ? 0 : a.charAt(ia) - '0';
      int bNum = (ib < 0) ? 0 : b.charAt(ib) - '0';

      int num = (aNum + bNum + carry) % 2;
      carry = (aNum + bNum + carry) / 2;
      sb.append(num);
    }
    if (carry == 1) sb.append(1);

    // important!
    sb.reverse();
    String result = sb.toString();
    return result;
  }
}

源码分析

用到的技巧主要有两点,一是两个数位数大小不一时用 0 补上,二是最后需要判断最高位的进位是否为 1。最后需要反转字符串,因为我们是从低位往高位迭代的。虽然可以使用 insert 避免最后的 reverse 操作,但如此一来时间复杂度就从 O(n)O(n)O(n) 变为 O(n2)O(n^2)O(n2) 了。

复杂度分析

遍历两个字符串,时间复杂度 O(n)O(n)O(n). reverse 操作时间复杂度 O(n)O(n)O(n), 故总的时间复杂度 O(n)O(n)O(n). 使用了 StringBuilder 作为临时存储对象,空间复杂度 O(n)O(n)O(n).

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文