LeetCode刷題18--二進位制求和
阿新 • • 發佈:2021-02-09
題目描述
給你兩個二進位制字串,返回它們的和(用二進位制表示)。
輸入為非空字串且只包含數字 1 和 0。
示例:
輸入: a = “11”, b = “1”
輸出: “100”
示例:
輸入: a = “1010”, b = “1011”
輸出: “10101”
提示:
每個字串僅由字元 ‘0’ 或 ‘1’ 組成。
1 <= a.length, b.length <= 10^4
字串如果不是 “0” ,就都不含前導零。
解題思路
string add(string s1,string s2) { string res; int s1Len=s1.length(); int s2Len=s2.length(); //判斷兩個字串哪個長,短的字串前面補'0' while(s1Len<s2Len) { s1='0'+s1; s1Len++; } while(s1Len>s2Len) { s2='0'+s2; s2Len++; } for(int i=s1.length()-1;i>0;i--) { s1[i]=s1[i]-'0'+s2[i]; if(s1[i]>'1') { s1[i]=(s1[i]-'0')%2+'0'; s1[i-1]=s1[i-1]+1; } } s1[0]=s1[0]-'0'+s2[0]; if(s1[0]>'1') { s1[0]=(s1[0]-'0')%2+'0'; s1='1'+s1; } return s1; } int main() { string a="11"; string b="1"; string a1="1010"; string b1="1011"; cout<<add(a,b)<<endl; cout<<add(a1,b1)<<endl; return 0; }
結果:
分析:
1.比較兩個字串,字串短的前面補’0’,為了位數一致方便計算。
2.開始計算,反向遍歷字串1,字串1的各個位置的值為字串1和字串2相加的值,注意,字串相加對應其ASCII碼值相加。
3.如果相加的值大於字元1的ASCII碼值,表示需要進位。
4.進位時,當前位置字元為0,前一位需要+1。
5.遍歷結束時,記錄第一位的數值,如果第一位發生進位,那麼,首位為字元0,前一位+1。
6.返回新的字串1。
注意:
1.字串相加為其對應的ASCII碼值相加。
2.‘0’-‘0’=0
3.‘0’+1=‘1’
4.‘1’+0=‘1’
5.'0’的ASCII碼為48,1的ASCII碼為49