二进制求和
给定两个二进制字符串,返回他们的和(用二进制表示)。
输入为非空字符串且只包含数字 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太不熟练