每天一道LeeCode7 【 二进制求和】

79 篇文章 0 订阅

二进制求和

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

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

示例 1:

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

示例 2:

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

思路

1、对string短的那个补齐(前面补‘0’)

2、将string转换为Int类型,注意这里不能一起转换,应该一位一位转为Int,因为一起转换理论上会出现超出int的范围的情况。

3、对转换成的两个vector<int> (这里长度是是相等的),逐位加起来,因为是2进制,所以应该进位是 sum/2,该位上留的数是sum%2。

4、对最后的进位处理,如果是1,则结果里面再push_back一个1,否则不处理

5、对结果(vector<int>类型)进行逆序输出,注意这里是end()-1,begin()-1,否正出错。。。

 for(auto i = res_vector.end()-1;i!=res_vector.begin()-1 ; i--)
    {
        cout<<*i<<" ";
    }

6、对结果逐位转为string类型。   

 res = res + '1';             //这里 res = res +"1"也可以
    //倒序遍历res_vector出现1就‘1’,0就是‘0’
    for(int i = res_vector.size()-1;i>=0;i--)
    {
        cout<<res_vector[i]<<"\t";
        if(res_vector[i] == 1)
        {
            res = res + '1';             //这里+"1"也可以
        }
        else
            res = res + '0';
    }

答案(本地编译器运行)

#include <iostream>
#include <vector>
using namespace std;

// "static void main" must be defined in a public class.
string addBinary(string a,string b)
{
    string res;
    string tmp;
    if(a.size()<b.size())//a是最长的  a>b
    {
        tmp = a;
        a = b;
        b = tmp;
    }

    int num = a.size()-b.size();//a和b差的个数
    string str1(num,'0');
    b.insert(0,str1);//用0补全


    vector<int> a_;
    vector<int> b_;


    //遍历a的每一个元素,提取到vector
    for(int i = 0;i<a.size();i++)
    {
        if(a[i] == '1')
        {
            a_.push_back(1);
        }
        else
            a_.push_back(0);
        cout<<"a: "<<a_[i]<<"\t";
    }

    cout<<endl;


    for(int i = 0;i<a.size();i++)
    {
        if(b[i] == '1')
        {
            b_.push_back(1);
        }
        else
            b_.push_back(0);

        cout<<"b: "<<b_[i]<<"\t";
    }

    int carry = 0;//进位初始值为0

    cout<<"\na_.size: "<<a_.size()<<endl;
    cout<<"\nb_.size: "<<b_.size()<<endl;
    //创建一个结果vector
    vector<int> res_vector;

    //遍历两个vector的每一个元素
    for(int i = a_.size()-1;i>=0;i--)
    {
        int bit_sum = 0;//每一位的和初始值为0
        bit_sum = a_[i]+b_[i]+carry;//三个数的和
        res_vector.push_back(bit_sum%2);//倒序存放结果
        carry = bit_sum/2;
//        cout<<"\nbit_summ%2:"<<bit_sum%2;

    }
    cout<<"\nres_vector size "<<res_vector.size()<<endl;

    //处理最后一个进位
    if(carry==1)
    {
        res_vector.push_back(carry);
    }
    cout<<"\nres_vector size "<<res_vector.size()<<endl;

    cout<<"\ndaoxu\n:"<<endl;
    for(auto i = res_vector.begin();i!=res_vector.end() ; i++)
    {
        cout<<*i<<" ";
    }
    cout<<"\nzhengxu\n:"<<endl;
    for(auto i = res_vector.end()-1;i!=res_vector.begin()-1 ; i--)
    {
        cout<<*i<<" ";
    }

    cout<<"\n-------------\n"<<endl;
    //倒序遍历res_vector出现1就‘1’,0就是‘0’
    for(int i = res_vector.size()-1;i>=0;i--)
    {
        cout<<res_vector[i]<<"\t";
        if(res_vector[i] == 1)
        {
            res = res + '1';
        }
        else
            res = res + '0';
    }

    return res;


//    cout<<a<<endl;
//    cout<<b<<endl;

}



int main() {
    string s1 = "10010";
    string s2 = "10001";
    string res = addBinary(s1,s2);
    cout<<"\n"<<res<<endl;

//    // 1. concatenate
//    s1 += "!";
//    cout << s1 << endl;
//    // 2. find
//    cout << "The position of first 'o' is: " << s1.find('o') << endl;
//    cout << "The position of last 'o' is: " << s1.rfind('o') << endl;
//    cout << "The position of first 'l' is: " << s1.find('l') << endl;
//    cout << "The position of last 'l' is: " << s1.rfind('l') << endl;
//    // 3. get substr
//    cout << s1.substr(6, 5) << endl;
}

LeeCode版本 

class Solution {
public:
   string addBinary(string a,string b)
{
    string res;
    string tmp;
    if(a.size()<b.size())//a是最长的  a>b
    {
        tmp = a;
        a = b;
        b = tmp;
    }

    int num = a.size()-b.size();//a和b差的个数
    string str1(num,'0');
    b.insert(0,str1);//用0补全


    vector<int> a_;
    vector<int> b_;


    //遍历a的每一个元素,提取到vector
    for(int i = 0;i<a.size();i++)
    {
        if(a[i] == '1')
        {
            a_.push_back(1);
        }
        else
            a_.push_back(0);
    }

    for(int i = 0;i<a.size();i++)
    {
        if(b[i] == '1')
        {
            b_.push_back(1);
        }
        else
            b_.push_back(0);
    }

    int carry = 0;//进位初始值为0


    //创建一个结果vector
    vector<int> res_vector;

    //遍历两个vector的每一个元素
    for(int i = a_.size()-1;i>=0;i--)
    {
        int bit_sum = 0;//每一位的和初始值为0
        bit_sum = a_[i]+b_[i]+carry;//三个数的和
        res_vector.push_back(bit_sum%2);//倒序存放结果
        carry = bit_sum/2;


    }


    //处理最后一个进位
    if(carry==1)
    {
        res_vector.push_back(carry);
    }





    //倒序遍历res_vector出现1就‘1’,0就是‘0’
    for(int i = res_vector.size()-1;i>=0;i--)
    {

        if(res_vector[i] == 1)
        {
            res = res + "1";
        }
        else
            res = res + '0';
    }

    return res;


}
};

总结

1、思路太蠢了。。。

2、vector、stl太不熟练

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tech沉思录

点赞加投币,感谢您的资瓷~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值