難度簡單404收藏分享切換爲英文關注反饋
給你兩個二進制字符串,返回它們的和(用二進制表示)。
輸入爲 非空 字符串且只包含數字 1
和 0
。
示例 1:輸入: a = "11", b = "1" 輸出: "100"
示例 2:輸入: a = "1010", b = "1011" 輸出: "10101"
提示:
- 每個字符串僅由字符
'0'
或'1'
組成。 1 <= a.length, b.length <= 10^4
- 字符串如果不是
"0"
,就都不含前導零。
思路一:(暴力法)
將二進制轉換成10進制,然後再將10進制轉換成2進制
但是這個程序有個Bug,要是二進制長度特別大,int的範圍會溢出。
class Solution {
public:
string addBinary(string a, string b)
{
if(a.empty()) return b;
if(b.empty()) return a;
string res;
int n = bi_to_int(a)+bi_to_int(b);
if(n==0) return "0";
while(n>0)
{
res.append(to_string(n%2));//將10進制轉成2進制字符串
n = n>>1;
}
reverse(res.begin(),res.end());// 除2 取餘 倒置
return res;
}
int bi_to_int(string a) //將2進制轉換成10進制
{
int i=0;
int num =0;
for(i = a.length()-1;i>=0;i--)
{
if(a.at(i)!='0')
{
num += pow(2,a.length()-1-i);//這個下標的處理,需要小心
}
}
return num;
}
};
class Solution {
public:
string addBinary(string a, string b)
{
if(a.empty()) return b;
if(b.empty()) return a;
string res;
int lena = a.size();
int lenb = b.size();
while(lena < lenb)//將兩個字符串變爲相同長度
{
a="0"+a;
lena++;
}
while(lenb < lena)
{
b="0"+b;
lenb++;
}
int flag = 0;
for(int i= lena-1;i>=0;i--)
{
if(a[i]-'0'+b[i]-'0'+flag ==0)
{
res ="0"+res;
flag =0;
}else if(a[i]-'0'+b[i]-'0'+flag ==1)
{
res ="1"+res;
flag =0;
}else if(a[i]-'0'+b[i]-'0'+flag ==2)
{
res ="0"+res;
flag =1;
}else if(a[i]-'0'+b[i]-'0'+flag ==3)
{
res ="1"+res;
flag =1;
}
}
if(flag ==1)
{
res ="1"+res;
}
return res;
}
};