博主并没有什么算法基础,所以写的不好,勿喷,抛砖引玉,欢迎交流,感谢。
//给你两个二进制字符串,返回它们的和(用二进制表示)。
// 输入为 非空 字符串且只包含数字 1 和 0。
// 示例 1:
// 输入: a = "11", b = "1"
//输出: "100"
// 示例 2:
// 输入: a = "1010", b = "1011"
//输出: "10101"
// 提示:
// 每个字符串仅由字符 '0' 或 '1' 组成。
// 1 <= a.length, b.length <= 10^4
// 字符串如果不是 "0" ,就都不含前导零。
// Related Topics 数学 字符串
// 👍 468 👎 0
package com.zqh.leetcode.editor.cn;
//Java:二进制求和
public class P67AddBinary {
public static void main(String[] args) {
Solution solution = new P67AddBinary().new Solution();
// System.out.println(solution.addBinary("11", "1"));
// System.out.println(solution.addBinary("111", "1"));
System.out.println(solution.addBinary("1001", "1"));
// System.out.println(solution.addBinary("1", "101"));
// System.out.println(solution.addBinary("1", "0"));
// System.out.println(solution.addBinary("1010", "1011"));
// System.out.println(solution.addBinary("1111", "1111"));
// System.out.println(solution.addBinary("110010", "10111"));
// System.out.println(1 ^ 1);
// System.out.println(1 ^ 0);
// System.out.println(0 ^ 0);
// TO TEST
}
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public String addBinary(String a, String b) {
char[] aChars = a.toCharArray();
char[] bChars = b.toCharArray();
return aChars.length >= bChars.length ? add(aChars, bChars) : add(bChars, aChars);
}
private String add(char[] aChars, char[] bChars) {
Boolean isUp = false;
StringBuilder stringBuilder = new StringBuilder();
// 思想:倒序,从尾部开始进行相加,然后下一位
for (int i = aChars.length - 1, j = 0; i >= 0; i--) {
// 计算bChars的坐标索引,因为前面调用时进行了判断,所以aCharts的长度一定是会大于等于bChars的
if (++j <= bChars.length) {
//判断是否有一个包含1
if ('1' == aChars[i] || '1' == bChars[bChars.length - j]) {
// 有一个包含1,并且2个都相等
if (aChars[i] == bChars[bChars.length - j]) {
// 如果i已经是0,也就是最后一位
if (i == 0) {
// 上一位的计算是up,说明这这一位需要+1,1+1+1=1,因为这里是长度相等的情况下才能进来,所以需要加一位
if (isUp) {
stringBuilder.append("11");
break;
}
// 上一位计算不是up,说明1+1+0=0,因为这里是长度相等的情况下才能进来,所以需要加一位
stringBuilder.append("01");
break;
}
if (isUp) {
//上一位的计算是up,所以1+1+1=1,并且继续进位
stringBuilder.append("1");
isUp = true;
continue;
}
//上一位的计算不是up。 因为不是最后一位,所以1+1=0
stringBuilder.append("0");
isUp = true;
continue;
}
//这2位数有一个是1,一个是0
if (isUp) {
//上一位的计算是up,所以1+0+1=0,并且继续进位
stringBuilder.append("0");
isUp = true;
continue;
}
//上一位的计算不是up。 因为不是最后一位,所以1+0=1,更改下一位up=false,不需要进位
stringBuilder.append("1");
isUp = false;
continue;
}
// 这2个数都是0
if (isUp) {
//上一位的计算是up,所以0+0+1=1,更改下一位up=false,不需要进位
stringBuilder.append("1");
isUp = false;
continue;
}
//2个数都不等于1,0+0=0
stringBuilder.append("0");
isUp = false;
continue;
}
// 来到这里,说明a的长度要比b的长度长,比如 111,1
if (isUp) {
// 上一位需要下一位进位
if ('1' == aChars[i]) {
//上一位的计算是up,并且当前位也是1
if (i == 0) {
//最后一位,1+1=10
stringBuilder.append("01");
break;
}
//不是最后一位,但因为当前位是1,所以1+1=0,并且进位,继续判断下一位是0还是1
isUp = true;
stringBuilder.append("0");
continue;
}
// 当前是0,所以0+1=1,没有进位,更改下一位up=false,不需要进位
isUp = false;
stringBuilder.append("1");
continue;
}
// 上一位的计算不需要下一位进行进位,所以一直增加就好啦,比如1001+1=1010
stringBuilder.append(aChars[i]);
}
//最后反转
return stringBuilder.reverse().toString();
}
}
//leetcode submit region end(Prohibit modification and deletion)
}