LeetCode做题笔记 - 67 - 二进制求和(简单)

题目:二进制求和(难度:简单)

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

The input strings are both non-empty and contains only characters 1 or 0.

Example 1:

Input: a = "11", b = "1"
Output: "100"

Example 2:

Input: a = "1010", b = "1011"
Output: "10101"

思路

也许会想到先二进制转十进制,相加再转成二进制。但是因为题目的二进制数,没有保证大小,所以可能超出int范围。还是老老实实地从低位开始相加进位。
设一个标志表示进位。以较长的那个字符串为基础进行操作。
从最低位开始,向高位遍历。每一位有以下几种情况(进位表示从低位获得的进位):

  1. 1+1+进位:得1,并向高位进位
  2. 1+1:得0,并向高位进位
  3. 1+0+进位:得0,并向高位进位
  4. 1+0:得0,无进位
  5. 0+0+进位:得到1,无进位
  6. 0+0:得到0,无进位

当较短的字符串遍历到头后,如果无进位,则结束。若有进位,则继续遍历较长的字符串,处理进位。
如果较长的字符串遍历到头,而且仍有进位,则最高位之前再添加一位1。

代码

class Solution {
public:
    string addBinary(string a, string b) {
        bool carry = false; // 进位
        int i = a.size()-1;
        int j = b.size()-1;
        string * base = i > j ? &a : &b; // 选择较长的作为基础
        int * it = i > j ? &i : &j;
        for (; i>=0 && j>=0; --i, --j)
        {
            if (a[i]=='1' && b[j]=='1')
            {
                (*base)[*it] = carry ? '1' : '0';
                carry = true;
            }
            else if (a[i]=='0' && b[j]=='0')
            {
                (*base)[*it] = carry ? '1' : '0';
                carry = false;
            }
            else // 0+1
            {
                (*base)[*it] = carry ? '0' : '1';
                carry = carry ? true : false;
            }
        }
        // 较短的遍历结束,仍有进位
        while (carry && *it >= 0)
        {
            bool isZero = ((*base)[*it] == '0');
            (*base)[*it] = isZero ? '1' : '0';
            carry = isZero ? false : true;
            --(*it);
        }
        // 较长的遍历结束,仍有进位
        if (carry)
        {
            return (string(1, '1').append(*base));
        }
        return *base;
    }
};
posted @   星夜之夏  阅读(166)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示