67. Add Binary
Given two binary strings, return their sum (also a binary string).
For example,
a = "11"
b = "1"
Return "100".
class Solution {
public:
string addBinary(string a, string b) {
}
};
解題思路:
主要考慮可能出現的邊界情況,如”0010”,” 10”;這樣的邊界情況。但是,我還沒有處理出現”
a1030 ”;這樣的情況。這樣的情況應該是非法輸入,但是我的程序會認爲它是”10”。解題的核心思路很簡單,(1)同時存在的情況;(2)只有一個存在的情況,長度較長的那個;(3)存在最後的進位的情況。
將上面的3種情況進行統一處理;真是厲害。而且使用了很多技巧。
學習收穫:
先尾插入,最後再進行倒序。
附件:程序
1、自己的程序:
class
Solution
{
public:
string
addBinary(string
a,
string
b)
{
string
a1;
auto
i
=
a.find_first_of("01");
if(i
!=
string::npos)
{
auto
j
=
a.find_first_not_of("01",
i
+
1);
if(j
==
string::npos)
{
j
=
a.size();
}
a1.insert(a1.end(),
a.begin()
+
i,
a.begin()
+
j);
}
string
b1;
auto
i1
=
b.find_first_of("01");
if(i1
!=
string::npos)
{
auto
j1
=
b.find_first_not_of("01",
i1
+
1);
if(j1
==
string::npos)
{
j1
=
b.size();
}
b1.insert(b1.end(),
b.begin()
+
i1,
b.begin()
+
j1);
}
//空字符
if(a1.size()
==
0
&&
b1.size()
==
0)
{
return{};
}
if(a1.size()
==
0
||
a1.find('1')
==
string::npos)
{
auto
tem
=
b1.find('1');
if(tem
==
string::npos)
{
return{
'0'
};
}
return
string(b1.begin()
+
tem,
b1.end());
}
if(b1.size()
==
0
||
b1.find('1')
==
string::npos)
{
auto
tem
=
a1.find('1');
if(tem
==
string::npos)
{
return{
'0'
};
}
return
string(a1.begin()
+
tem,
a1.end());
}
string
res;
int
len1
=
a1.size();
int
len2
=
b1.size();
int
len3
=
len1
>
len2?len1:len2;
res.reserve(len3);
int
carry
=
0;
--len1;
--len2;
while(len1
>=
0
&&
len2
>=
0)
{
int
sum
=
a1[len1]
-
'0'
+
b1[len2]
-
'0'
+
carry;
if(sum
>
1)
{
res.push_back((sum
%
2)
+
'0');
carry
=
1;
}
else
{
res.push_back(sum
+
'0');
carry
=
0;
}
--len1;
--len2;
}
while(len1
>=
0)
{
int
sum
=
a1[len1]
-
'0'
+
carry;
if(sum
>
1)
{
res.push_back((sum
%
2)
+
'0');
carry
=
1;
}
else
{
res.push_back(sum
+
'0');
carry
=
0;
}
--len1;
}
while(len2
>=
0)
{
int
sum
=
b1[len2]
-
'0'
+
carry;
if(sum
>
1)
{
res.push_back((sum
%
2)
+
'0');
carry
=
1;
}
else
{
res.push_back(sum
+
'0');
carry
=
0;
}
--len2;
}
if(carry)
{
res.push_back('1');
}
auto
lt
=
res.rfind('1');
auto
zeros
=
res.size()
-
lt
-
1;
return
string(res.rbegin()
+
zeros,
res.rend());
}
};
2、別人的程序
這裏有許多技巧。位操作;提前分配空間,方便插入;3操作合一;頭插變尾插。
class
Solution
{
public:
string
addBinary(string
a,
string
b)
{
string
s;
s.reserve(a.size()
+
b.size());
int
c
=
0,
i
=
a.size()
-
1,
j
=
b.size()
-
1;
while(i
>=
0
||
j
>=
0
||
c
==
1)
{
c
+=
i
>=
0
?
a[i--]
-
'0'
:
0;
c
+=
j
>=
0
?
b[j--]
-
'0'
:
0;
//s
= char(c
% 2 + '0') + s; //this can run, but time complex is great
s.push_back((c
&
1)
+
'0');
c
>>=
1;
}
reverse(s.begin(),
s.end());
return
s;
}
};