題目
給你兩個二進制字符串,返回它們的和(用二進制表示)。輸入爲 非空 字符串且只包含數字 1 和 0。
示例 1:
輸入: a = “11”, b = “1”
輸出: “100”
示例 2:
輸入: a = “1010”, b = “1011”
輸出: “10101”
語言:C++
外部依賴:單元測試庫-gtest
規範:需要自己寫單元測試類,來進行提交前的測試,減少重複工作,並且對非法輸入進行過濾
詳解:
邏輯就是從字符串的最後一位開始遍歷,將兩個字符串取出來的字符以及上一個進位進行相加,獲得下一個進位以及當前下標的數據。如果此時的下標超過了其中一個字符串的長度,那就設當前字符串下標上的取得的數據爲0,當下標超過兩個字符串的最長位數,停止循環。
#include<iostream>
#include<stack>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
using namespace std;
namespace slution{
//輸入爲 非空 字符串且只包含數字 1 和 0
class Solution {
public:
string addBinary(string a, string b) {
//miniLen代表兩個字符串中最短的長度 採用駝峯命名法
//相加無非三種情況 0+0=0 1+0=1 1+1=0 進一位
int cnt = 1;
int c = 0;
int aLen = a.size();
int bLen = b.size();
int tmpA,tmpB;
string result = "";
//當遍歷的長度沒有達到長字符串的長度時候 繼續遍歷
while(cnt<=aLen||cnt<=bLen){
//取當前字符串的字符
if(cnt<=aLen){
tmpA = a[aLen-cnt] - '0';
}else{
tmpA = 0;
}
if(cnt<=bLen){
tmpB = b[bLen-cnt] - '0';
}else{
tmpB = 0;
}
char tmp = (tmpA+tmpB+c)%2 + '0';
c = (tmpA+tmpB+c)/2;
result = tmp+result;
cnt++;
}
//如果最後的進位是1 那麼在字符串前後添加1
if(c==1)
result = "1" + result;
return result;
}
};
}
#include<cstdio>
#include<gtest/gtest.h>
#include "solution.h"
using namespace slution;
//單元測試
Solution slu;
TEST(slutiontest, HandleNormalInput)
{
string input1 = "110";
string input2 = "1";
string output1 = "111";
EXPECT_EQ(output1, slu.addBinary(input1,input2));
input1 = "11";
input2 = "1";
output1 = "100";
EXPECT_EQ(output1, slu.addBinary(input1,input2));
input1 = "1010";
input2 = "1011";
output1 = "10101";
EXPECT_EQ(output1, slu.addBinary(input1,input2));
}
TEST(slutiontest, HandleExtremeInput)
{
string input1 = "0";
string input2 = "0";
string output1 = "0";
EXPECT_EQ(output1, slu.addBinary(input1,input2));
}
int main(int argc, char *argv[])
{
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
return 0;
}
結果
執行結果:
通過
顯示詳情
執行用時:0 ms, 在所有 C++ 提交中擊敗了100.00%的用戶
內存消耗:7.1 MB, 在所有 C++ 提交中擊敗了100.00%的用戶