原题目链接:67. 二进制求和
题目描述:
给你两个二进制字符串,返回它们的和(用二进制表示)。
输入为 非空 字符串且只包含数字 1 和 0。
示例 1:
输入: a = "11", b = "1"
输出: "100"
示例 2:
输入: a = "1010", b = "1011"
输出: "10101"
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-binary
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
做题思路:
- 整体思路是将两个字符串较短的用 0 补齐,使得两个字符串长度一致,然后从末尾进行遍历计算,得到最终结果
- 但是有一个问题,出现了求和之后,字符串多了一个字符,例如 11 和 1 二进制相加,变成了 100 ,那么对于这种情况,我是采用反转来进行处理
废话不多说,直接上代码,为了让各位看官更能清晰理解,我的代码写得不精简,我的代码里加了大量的注释,相信各位看官可以理解,如果我有些没写清楚或者写错的,可以评论区或者私信我喔
public String addBinary(String a, String b) {
//用于字符串拼接
StringBuilder ans = new StringBuilder();
//判断是否出现二进制
int he = 0;
//开始遍历两个字符串,从最后一个字符开始遍历
for(int i = a.length() - 1, j = b.length() - 1;i >= 0 || j >= 0; i--,j--){
//用于下次循环是否出现二进制
int sum = he;
// 获取字符串a对应的某一位的值 当i<0是 sum+=0(向前补0) 否则取原值 ‘1’的char类型和‘0’的char类型刚好相差为1
//这里是利用了char类型的ASCII值
//如果这里不-'0',那sum加的值就变成了ASCII值,可能是48,也可能是49
sum += (i >= 0 ? a.charAt(i) - '0' : 0);
// 获取字符串b对应的某一位的值 当j<0是 sum+=0(向前补0) 否则取原值 ‘1’的char类型和‘0’的char类型刚好相差为1
sum += (j >= 0 ? b.charAt(j) - '0' : 0);
//开始拼接
//如果两个数都是1,则拼接的是0,因为是二进制
ans.append(sum % 2);
//如果两个数都是1,则要向前进1,那么下次循环的时候he就把这个1加进去
he = sum / 2;
}
//循环结束,可能出现多一位的情况,所以要进行判断
ans.append(he == 1 ? he : "");
//反转,这里要反转是因为字符串拼接是从后面开始的
//例如100和1,变成101+"",反转后,还是101
//例如11和1,变成001,反转后,变成100
//这就是反转的意思所在
//并且变成String类,因为题目要求返回String类
return ans.reverse().toString();
}