leetcode 67:二进制求和

/**
 * @Class AddBinary
 * @Description 67. 二进制求和
 * 给你两个二进制字符串,返回它们的和(用二进制表示)。
 * 输入为 非空 字符串且只包含数字 1 和 0。
 * <p>
 * 示例 1:
 * 输入: a = "11", b = "1"
 * 输出: "100"
 * <p>
 * 示例 2:
 * 输入: a = "1010", b = "1011"
 * 输出: "10101"
 * @Author 
 * @Date 2020/6/23
 **/
public class AddBinary {
}
public static String addBinary(String a, String b) {
	if (a == null || a == "") {
		return b;
	}
	if (b == null || b == "") {
		return a;
	}

	StringBuilder c = new StringBuilder("");
	boolean flag = false;
	int p = a.length() - 1;
	int q = b.length() - 1;
	int tempA = 0, tempB = 0, tempC = 0;
	while (p >= 0 && q >= 0) {
		tempA = Integer.valueOf(a.charAt(p) - '0');
		tempB = Integer.valueOf(b.charAt(q) - '0');
		tempC = tempA + tempB + (flag == true ? 1 : 0);
		flag = tempC > 1 ? true : false;
		c.append(tempC % 2);
		p--;
		q--;
	}
	while (p >= 0) {
		tempA = Integer.valueOf(a.charAt(p) - '0');
		tempC = tempA + (flag == true ? 1 : 0);
		flag = tempC > 1 ? true : false;
		c.append(tempC % 2);
		p--;
	}
	while (q >= 0) {
		tempB = Integer.valueOf(b.charAt(q) - '0');
		tempC = tempB + (flag == true ? 1 : 0);
		flag = tempC > 1 ? true : false;
		c.append(tempC % 2);
		q--;
	}

    // 最后判断是否需要进位
	if (flag) {
		c.append("1");
	}
	return c.reverse().toString();
}
/**
 * 解法2:较短的部分用'0'补齐
 */
public static String addBinary(String a, String b) {
	StringBuilder ans = new StringBuilder("");
	int lenA = a.length();
	int lenB = b.length();
	int maxlen = Math.max(lenA, lenB);
	boolean flag = false;

   /* 方式1:
	for (int i = maxlen - 1; i >= 0; i--) {
		// 字符串a的下标
		int indexA = i + lenA - maxlen;
		// 字符串b的下标
		int indexB = i + lenB - maxlen;
		int sum = (indexA >= 0 ? a.charAt(indexA) - '0' : 0)
				+ (indexB >= 0 ? b.charAt(indexB) - '0' : 0);
		sum += flag == true ? 1 : 0;
		ans.append(sum % 2);
		flag = sum / 2 > 0 ? true : false;
	}
	*/
	// 方式2:两个指针分别指向字符串,分别移动
	for (int i = lenA - 1, j = lenB - 1; i >= 0 || j >= 0; i--, j--) {
		int sum = (i >= 0 ? a.charAt(i) - '0' : 0)
				+ (j >= 0 ? b.charAt(j) - '0' : 0);
		sum += flag == true ? 1 : 0;
		ans.append(sum % 2);
		flag = sum / 2 > 0 ? true : false;
	}
    // 最后判断是否需要进位
	if (flag) {
		ans.append("1");
	}
	return ans.reverse().toString();
}
// 测试用例
public static void main(String[] args) {
	String a = "11", b = "11";
	String ans = addBinary(a, b);
	System.out.println("demo01 result:" + ans);

	a = "1010";
	b = "1011";
	ans = addBinary(a, b);
	System.out.println("demo02 result:" + ans);

	a = "1";
	b = "111";
	ans = addBinary(a, b);
	System.out.println("demo03 result:" + ans);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值