题目描述
给定两个二进制字符串,返回他们的和(用二进制表示)。
输入为非空字符串且只包含数字 1 和 0。
示例 1:
输入: a = "11", b = "1"
输出: "100"
示例 2:
输入: a = "1010", b = "1011"
输出: "10101"
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-binary
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
我的思路
-
把两个字符串全部转换成相应的字符数组。
-
设置两个指针变量,分别指向两个数组的最后一个元素。
-
设置一个字符数组变量,指向上面两个数组长度较长的那个;一个整数,指向那个较长数组的最后一个元素。
-
从两个数组尾部依次往前判断计算结果,有无进位,保存当前位的计算结果,直到其中一个数组遍历完。有2种情况:
4.1
如果没有进位,则返回最终结果。
4.2
如果还有进位,继续处理那个长度较长的数组,当前位加上进位标志jinwei
,如果不再发生进位,先保存当前位结果,再返回最终结果;如果还有进位,则继续往前(高位或索引小的方向)处理,直到不再进位。 -
如果处理完较长数组还是有进位,说明最高位发生进位,数组长度需要加一,第一个字符为
'1'
,后面依次复制前面的计算结果即可。最后返回结果。
我的程序(Java)
class Solution {
public String addBinary(String a, String b) {
char[] aCharArray = a.toCharArray(); // 将2个字符串转换成字符数组
char[] bCharArray = b.toCharArray();
int jinwei = 0; // 进位标志位
int aIndex = aCharArray.length - 1; // 初始化两个字符数组的末尾索引
int bIndex = bCharArray.length - 1;
char[] res;
int resIndex;
if(a.length() >= b.length()){// res指向长度较大的字符数组,resIndex为对应数组的最后一个索引
res = aCharArray;
resIndex = aIndex;
}else{
res = bCharArray;
resIndex = bIndex;
}
while(aIndex >= 0 && bIndex >= 0){
int sum = (aCharArray[aIndex] - '0') + (bCharArray[bIndex] - '0') + jinwei;
if(sum > 1){ // 可能为2或者3
jinwei = 1;
res[resIndex] = (char)(sum % 2 + '0');
}else{
res[resIndex] = (char)(sum + '0');
jinwei = 0; // 后面还是有可能发生进位,不能直接返回结果
}
resIndex--;
aIndex--;
bIndex--;
}
if(jinwei == 0) // 没有进位,则返回结果
return new String(res);
while(resIndex >= 0){ // 当有一个位数比较多,将这个数组剩下的字符处理完
int sum = res[resIndex] - '0' + jinwei;
if(sum > 1){
jinwei = 1;
res[resIndex] = (char)(sum % 2 + '0');
}else{
res[resIndex] = (char)(sum + '0');
return new String(res); // 这边因为只处理一个数组,如果此次没有进位,下次也不可能进位
}
resIndex--;
} //当这个数组全部处理完,还没有返回结果,说明还有进位,数组长度要比原来长的那个还要加一
char[] lres = new char[res.length + 1]; // 数组长度加一
lres[0] = '1'; // 第一个字符肯定时'1'
for(int i = 1; i < lres.length; i++){
lres[i] = res[i-1]; // 后面依次复制原来的结果
}
return new String(lres);
}
}
其他方法,可参考灵魂画师牧码
如有不当之处,欢迎读者批评指正!