zoukankan      html  css  js  c++  java
  • leetcode 67. 二进制求和

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

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

    示例 1:

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

    示例 2:

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

     1 #include<algorithm>
     2 class Solution {
     3 public:
     4     string addBinary(string a, string b) {
     5         if(a.size()<b.size()){//让a保存a,b中最长的字符串
     6             string temp = a;
     7             a = b;
     8             b = temp;
     9         }//翻转字符串,便于运算
    10         reverse(a.begin(), a.end());
    11         reverse(b.begin(), b.end());
    12         int carry = 0;
    13        for(int i=0; i<b.size(); i++){
    14            int t = (a[i]-'0') + (b[i]-'0') + carry;
    15            if(t>=2){//满2进1
    16                a[i] = (t%2)+'0';
    17                carry = 1;
    18            }else{
    19                a[i] = t + '0';
    20                carry = 0;
    21            }
    22        }
    23         for(int i=b.size(); i<a.size(); i++){
    24             int t = (a[i]-'0') + carry;
    25             if(t>=2){
    26                 a[i] = '0';
    27                 carry = 1;
    28             }else{
    29                 a[i] = t + '0';
    30                 carry = 0;
    31             }
    32         }
    33         if(carry == 1) a += '1';
    34         reverse(a.begin(), a.end());
    35         return a;
    36     }
    37 };

    在b的后面添加'0', 让加法趋于一致

     1 #include<algorithm>
     2 class Solution {
     3 public:
     4     string addBinary(string a, string b) {
     5         if(a.size()<b.size()){//让a保存a,b中最长的字符串
     6             string temp = a;
     7             a = b;
     8             b = temp;
     9         }//翻转字符串,便于运算
    10         reverse(a.begin(), a.end());
    11         reverse(b.begin(), b.end());
    12         int carry = 0;
    13         for(int i=b.size(); i<a.size(); i++) b += '0';
    14        for(int i=0; i<a.size(); i++){
    15            int t = (a[i]-'0') + (b[i]-'0') + carry;
    16            if(t>=2){//满2进1
    17                a[i] = (t%2)+'0';
    18                carry = 1;
    19            }else{
    20                a[i] = t + '0';
    21                carry = 0;
    22            }
    23        }
    24         if(carry == 1) a += '1';
    25         reverse(a.begin(), a.end());
    26         return a;
    27     }
    28 };

    进一步精简代码,把重复的操作合并,减少不必要的操作

     1 #include<algorithm>
     2 class Solution {
     3 public:
     4     string addBinary(string a, string b) {
     5         if(a.size()<b.size()) swap(a, b);
     6         int carry = 0;
     7         for(int i=b.size(); i<a.size(); i++) b = '0' + b;
     8         for(int i=a.size()-1; i>=0; i--){
     9            int t = (a[i]-'0') + (b[i]-'0') + carry;
    10            a[i] = (t%2) + '0';
    11            carry = t/2;
    12        }
    13         if(carry == 1) a = '1' + a;
    14         return a;
    15     }
    16 };
    有疑惑或者更好的解决方法的朋友,可以联系我,大家一起探讨。qq:1546431565
  • 相关阅读:
    团队冲刺二(6)
    团队冲刺二(5)
    JAVA面试中问及HIBERNATE与 MYBATIS的对比,在这里做一下总结
    解决ADB server didn't ACK问题,连上手机问题
    ADB server didn't ACK
    android错误
    Andy
    在Eclipse下搭建Android开发环境教程
    VM VirtualBox 安装 Android 4.3虚拟机完整教程
    电脑安装Android4.0虚拟机的做法
  • 原文地址:https://www.cnblogs.com/mr-stn/p/9031058.html
Copyright © 2011-2022 走看看