zoukankan      html  css  js  c++  java
  • LeetCode(67):二进制求和

    Easy!

    题目描述:

    给定两个二进制字符串,返回它们的和(用二进制表示)。

    输入为非空字符串且只包含数字 1 和 0

    示例 1:

    输入: a = "11", b = "1"
    输出: "100"

    示例 2:

    输入: a = "1010", b = "1011"
    输出: "10101"

    解题思路:

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

    C++解法一:

     1 class Solution {
     2 public:
     3     string addBinary(string a, string b) {
     4         string res;
     5         int na = a.size();
     6         int nb = b.size();
     7         int n = max(na, nb);
     8         bool carry = false;
     9         if (na > nb) {
    10             for (int i = 0; i < na - nb; ++i) b.insert(b.begin(), '0');
    11         }
    12         else if (na < nb) {
    13             for (int i = 0; i < nb - na; ++i) a.insert(a.begin(), '0');
    14         }
    15         for (int i = n - 1; i >= 0; --i) {
    16             int tmp = 0;
    17             if (carry) tmp = (a[i] - '0') + (b[i] - '0') + 1;
    18             else tmp = (a[i] - '0') + (b[i] - '0');
    19             if (tmp == 0) {
    20                 res.insert(res.begin(), '0');
    21                 carry = false;
    22             }
    23             else if (tmp == 1) {
    24                 res.insert(res.begin(), '1');
    25                 carry = false;
    26             }
    27             else if (tmp == 2) {
    28                 res.insert(res.begin(), '0');
    29                 carry = true;
    30             }
    31             else if (tmp == 3) {
    32                 res.insert(res.begin(), '1');
    33                 carry = true;
    34             }
    35         }
    36         if (carry) res.insert(res.begin(), '1');
    37         return res;
    38     }
    39 };

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

    C++解法二:

     1 class Solution {
     2 public:
     3     string addBinary(string a, string b) {
     4         string res = "";
     5         int m = a.size() - 1, n = b.size() - 1, carry = 0;
     6         while (m >= 0 || n >= 0) {
     7             int p = m >= 0 ? a[m--] - '0' : 0;
     8             int q = n >= 0 ? b[n--] - '0' : 0;
     9             int sum = p + q + carry;
    10             res = to_string(sum % 2) + res;
    11             carry = sum / 2;
    12         }
    13         return carry == 1 ? "1" + res : res;
    14     }
    15 };
  • 相关阅读:
    childNodes和Children的区别
    解决org.hibernate.QueryException illegal attempt to dereference collection 异常错误
    莆田系医院名单
    SQLite3初级使用
    dwr学习 之 一、dwr+spring的简单集成
    GitHub使用方法(初级)
    MyEclipse中安装SVN插件的最有效的方法
    Firefox下载安装fireBug提示下载出错的解决方案
    音频在线剪截
    解析新第三方登录方式——苹果登录「Sign in with Apple
  • 原文地址:https://www.cnblogs.com/ariel-dreamland/p/9151374.html
Copyright © 2011-2022 走看看