【题解】二进制之和 | 豆包MarsCode AI刷题

56 阅读2分钟

题目分析

  1. 从两个字符串的末尾开始逐位相加,处理进位。
  2. 如果一个字符串比另一个长,继续处理较长的字符串的剩余部分。
  3. 如果还有进位,将其加到结果的最前面。

难点分析

  1. 用sum%2来处理进位,超出2就用sum和2取余,sum的值变为sum/2(向下取整)
  2. 将最后得到的结果反转一下再转换为10进制,不然结果是错的

解题思路

  1. 使用 while 循环从两个字符串的末尾开始逐位相加。 sum 变量存储当前位的和,carry 变量存储进位。

  2. 如果 sum 大于等于 2,则产生进位。 最后检查是否有剩余的进位,并将其加到结果中。

  3. 利用String binarySum = result.reverse().toString();result反转,因为之前是从末尾开始构建结果字符串的,现在需要将其反转以得到正确的二进制数结果,然后转换为String类型。

  • 然后将二进制字符串binarySum通过Integer.parseInt以二进制形式解析为整数,然后再通过Integer.toString将这个整数转换为十进制字符串并返回。

部分代码

        // 从末尾开始逐位相加
        while (i >= 0 || j >= 0) {
            int sum = carry;
            if (i >= 0) sum += binary1.charAt(i--) - '0';
            if (j >= 0) sum += binary2.charAt(j--) - '0';
            result.append(sum % 2);
            carry = sum / 2;
        }

        // 处理最后的进位
        if (carry != 0) {
            result.append(carry);
        }

        // 将结果反转并转换为十进制
        String binarySum = result.reverse().toString();
        return Integer.toString(Integer.parseInt(binarySum, 2));
    }
}

算法思路

通过从二进制数的末尾开始逐位相加,并处理进位,能够正确地计算两个二进制数的和。类似于手工计算二进制加法的过程,逻辑清晰,易于理解。

复杂度分析

时间复杂度

假设 a字符串长度为a, b字符串长度为b ,如果a大于b,则时间复杂度为a,反之为b 。时间复杂度取决于两个二进制数的长度,假设两个二进制数的长度分别为mn,在最坏情况下时间复杂度为𝑂(𝑚𝑎𝑥(𝑚,𝑛))O(max(m,n)),因为while循环会执行的次数最多为两个数中较长的那个数的位数。

空间复杂度

  • 除了输入的两个二进制数字符串,代码中主要使用了一个StringBuilder对象result来存储结果。在最坏情况下,结果字符串的长度最多为较长的输入二进制数的长度加1(考虑进位的情况),所以空间复杂度为𝑂(𝑚𝑎𝑥(𝑚,𝑛))O(max(m,n))。