1. 程式人生 > 其它 >LeetCode刷題18--二進位制求和

LeetCode刷題18--二進位制求和

技術標籤:刷題!!!leetcode字串

題目描述

給你兩個二進位制字串,返回它們的和(用二進位制表示)。
輸入為非空字串且只包含數字 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