LeetCode67 二进制

题目

给定两个二进制字符串,返回他们的和(用二进制表示)。
输入为非空字符串且只包含数字 1 和 0。

示例

  1. 示例 1:
    输入: a = “11”, b = “1”
    输出: “100”
  2. 示例 2:
    输入: a = “1010”, b = “1011”
    输出: “10101”

C++代码

首先判断两个字符串的长短,以短的为准,从后往前逐个对两个字符串的元素进行判断。设置temp储存进位符,为1则进位。
此外还要注意string中的元素为char型,所以里边的数字对应的是其ASCII码,比较时要进行转换,0对应的ASCII码是48

class Solution {
public:
    string addBinary(string a, string b) 
    {
     string sum = "";
     int m = a.length();
     int n = b.length();
     string smax,smin;
     int max, min;
     if (m>n)
     {
      max = m;
      min = n;
      smax = a;
      smin = b;
     }
     else
     {
      max = n;
      min = m;
      smax = b;
      smin = a;
     }
     int temp = 0; //进位符
     int i = max - 1;
     int j = min - 1;
     while (j >= 0) //以短的字符串为准进行循环
     {
      temp = temp / 2 + smax[i] + smin[j]-96;
      sum = to_string(temp % 2) + sum;
      i--;
      j--;
     }
     if (i - j) //如果两个字符串不等长
     {
     	for (int k = i; k >= 0; k--)
      	{
       		temp = smax[k] + temp / 2 - 48; 
       		sum = to_string(temp % 2) + sum;
      	}
     }
     if (temp/2) sum = to_string(temp / 2) + sum; //字符串的首位,判断是否进位
     return sum;
    }
};

另外一种想法(有弊端),将两个字符串转换成int型,然后直接相加,可以预料到和当中每一位数只可能是0,1,2,然后再将和转换成string从后往前进行逐位判断,若该位加上进位符后大于等于2,则进位,进位后该位上的元素为其除以2的商。
但是,int型表示的变量是有大小限制的([-2^31, 2 ^31 -1] ),所以当超出限制时,就会报错。。。当然也可以使用unsigned int,不过无论如何以避免不了超出限制的问题。。。

class Solution {
public:
    string addBinary(string a, string b) 
    {
     int tempa = stoi(a);
     int tempb = stoi(b);
     int tempsum = tempa + tempb;
     string sum = to_string(tempsum);
     int n = sum.length();
     int temp; //进位符
     string result = to_string((sum[n - 1] - 48) % 2);
     if (sum[n - 1] - 48 == 2) temp = 1;
     else temp = 0;
     for (int i = n - 2; i >= 0; i--)
     {
      result = to_string((sum[i] - 48 + temp) % 2) + result;
      if (sum[i] - 48 + temp >= 2) temp = 1;
      else temp = 0;
     }
     if(temp) result= to_string(temp % 2) + result;
     return result;
        }
};

猜你喜欢

转载自blog.csdn.net/Fang_D/article/details/83069250