leetcode67. 二进制求和

法一:一开始写的倒序操作字符串,符合正常手算。
class Solution {
public String addBinary(String a, String b) {
if(a.length() < b.length()) return addBinary(b,a);
int aLen = a.length(),bLen = b.length();
StringBuilder sb = new StringBuilder();
for(int i = 0;i < (aLen - bLen);++i){
sb.append("0");
}
sb.append(b);
b = sb.toString();
int flag = 0;
for(int i = aLen - 1;i >= 0;--i){
int plus = a.charAt(i) + b.charAt(i) - 2 * '0' + flag;
if(plus <= 1){
if(plus == 0) sb.setCharAt(i,'0');
else if(plus == 1) sb.setCharAt(i,'1');
flag = 0;
}else{
if(plus == 2) sb.setCharAt(i,'0');
else if(plus == 3) sb.setCharAt(i,'1');
flag = 1;
}
}
if(flag == 1) return ("1" + sb).toString();
return sb.toString();
}
}
法一优化:对plus值的判断(plus <=1和 plus == 2或 3)可以简化为直接用取模和除法运算处理当前位和进位。
class Solution {
public String addBinary(String a, String b) {
if (a.length() < b.length()) {
return addBinary(b, a);
}
int lenA = a.length(), lenB = b.length();
StringBuilder res = new StringBuilder(); // 用于存储结果
int carry = 0; // 进位
// 从右向左遍历每一位
for (int i = 0; i < lenA; i++) {
int digitA = a.charAt(lenA - 1 - i) - '0';//获取a的当前位数字
// 获取b的当前位数字,如果b已遍历完则为0
int digitB = (i < lenB) ? b.charAt(lenB - 1 - i) - '0' : 0;
int sum = digitA + digitB + carry; // 当前位总和
res.append(sum % 2); // 当前位结果
carry = sum / 2; // 更新进位
}
// 处理最后的进位
if (carry > 0) res.append('1');
// 由于我们是反向添加的,需要反转得到正确结果
return res.reverse().toString();
}
}
法二:直接使用api。如果二进制字符串较大此方法不能通过。
class Solution {
public String addBinary(String a, String b) {
return Integer.toBinaryString(
Integer.parseInt(a, 2) + Integer.parseInt(b, 2)
);
}
}
浙公网安备 33010602011771号