C++实现LeetCode(67.二进制数相加)

 更新时间:2021年07月16日 17:00:38   作者:Grandyang  
这篇文章主要介绍了C++实现LeetCode(67.二进制数相加),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

[LeetCode] 67. Add Binary 二进制数相加

Given two binary strings a and b, return their sum as a binary string.

Example 1:

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

Example 2:

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

Constraints:

  • 1 <= a.length, b.length <= 104
  • a and b consist only of '0' or '1' characters.
  • Each string does not contain leading zeros except for the zero itself.

二进制数相加,并且保存在 string 中,要注意的是如何将 string 和 int 之间互相转换,并且每位相加时,会有进位的可能,会影响之后相加的结果。而且两个输入 string 的长度也可能会不同。这时我们需要新建一个 string,它的长度是两条输入 string 中的较大的那个,并且把较短的那个输入 string 通过在开头加字符 ‘0' 来补的较大的那个长度。这时候逐个从两个 string 的末尾开始取出字符,然后转为数字,想加,如果大于等于2,则标记进位标志 carry,并且给新 string 加入一个字符 ‘0'。代码如下:

解法一:

class Solution {
public:
    string addBinary(string a, string b) {
        string res;
        int na = a.size(), nb = b.size(), n = max(na, nb), carry = 0;
        if (na > nb) {
            for (int i = 0; i < na - nb; ++i) b.insert(b.begin(), '0');
        } else {
            for (int i = 0; i < nb - na; ++i) a.insert(a.begin(), '0');
        }
        for (int i = n - 1; i >= 0; --i) {
            int sum = (a[i] - '0') + (b[i] - '0') + carry;
            res = to_string(sum % 2) + res;
            carry = sum / 2;
        }
        if (carry) res.insert(res.begin(), '1');
        return res;
    }
};

下面这种写法又巧妙又简洁,用了两个指针分别指向a和b的末尾,然后每次取出一个字符,转为数字,若无法取出字符则按0处理,然后定义进位 carry,初始化为0,将三者加起来,对2取余即为当前位的数字,对2取商即为当前进位的值,记得最后还要判断下 carry,如果为1的话,要在结果最前面加上一个1,参见代码如下:

解法二:

class Solution {
public:
    string addBinary(string a, string b) {
        string res = "";
        int m = a.size() - 1, n = b.size() - 1, carry = 0;
        while (m >= 0 || n >= 0) {
            int p = m >= 0 ? a[m--] - '0' : 0;
            int q = n >= 0 ? b[n--] - '0' : 0;
            int sum = p + q + carry;
            res = to_string(sum % 2) + res;
            carry = sum / 2;
        }
        return carry == 1 ? "1" + res : res;
    }
};

到此这篇关于C++实现LeetCode(67.二进制数相加)的文章就介绍到这了,更多相关C++实现二进制数相加内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅谈c++的编译和运行

    浅谈c++的编译和运行

    下面小编就为大家带来一篇浅谈c++的编译和运行。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • 从C++单例模式到线程安全详解

    从C++单例模式到线程安全详解

    下面小编就为大家带来一篇从C++单例模式到线程安全详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • C语言循环队列的表示与实现实例详解

    C语言循环队列的表示与实现实例详解

    这篇文章主要介绍了C语言循环队列的表示与实现,对于数据结构与算法的研究很有帮助,需要的朋友可以参考下
    2014-07-07
  • C++学习之异常机制详解

    C++学习之异常机制详解

    C++中的异常处理机制可以帮助我们处理程序在运行时可能会遇到的异常情况,比如内存分配错误、文件打开失败等。本文就和大家详细讲讲C++中异常机制的具体使用吧
    2023-04-04
  • C++中的while循环和for循环语句学习教程

    C++中的while循环和for循环语句学习教程

    这篇文章主要介绍了C++中的while循环和for循环语句学习教程,是C++入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09
  • 一文读懂C++ 虚函数 virtual

    一文读懂C++ 虚函数 virtual

    这篇文章主要介绍了C++ 虚函数 virtual的相关资料,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • Qt QMessageBox类使用教程

    Qt QMessageBox类使用教程

    QMessageBox类提供一个模态对话框,用于通知用户或询问用户一个问题并接收答案。这篇文章主要介绍了QMessageBox的一些常用用法,需要的小伙伴快来学习一下
    2021-12-12
  • C++基本算法思想之递推算法思想

    C++基本算法思想之递推算法思想

    递推算法需要用户知道答案和问题之间的逻辑关系。在许多数学问题中,都有明确的计算公式可以遵循,因此可以采用递推算法来实现
    2013-10-10
  • C语言模拟实现C++的继承与多态示例

    C语言模拟实现C++的继承与多态示例

    本篇文章主要介绍了C语言模拟实现C++的继承与多态示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • OpenCV 通过Mat遍历图像的方法汇总

    OpenCV 通过Mat遍历图像的方法汇总

    对图像中的所有点或特殊点进行运算,所以遍历图像就显得很重要,如何高效的遍历图像是一个很值得探讨的问题,本文给大家带来了多种方法操作OpenCV 通过Mat遍历图像,感兴趣的朋友一起看看吧
    2022-02-02

最新评论