LeetCode-二进制求和
题目
给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。
示例 1:
输入:a = "11", b = "1"
输出:"100"
示例 2:
输入:a = "1010", b = "1011"
输出:"10101"
我的解答
我想的很简单,从字符串的高位一直计算,专门用一个布尔值记录是否有进位,虽然代码行数多,但是计算结果是对的。
class Solution {
public String addBinary(String a, String b) {
int aLen = a.length();
int bLen = b.length();
int maxLen = Math.max(aLen, bLen);
StringBuilder sb = new StringBuilder();
boolean add = false;
for (int i = 0; i < maxLen; i++) {
if(aLen-1-i>=0&&bLen-1-i>=0){
char aChar = a.charAt(aLen - 1 - i);
char bChar = b.charAt(bLen - 1 - i);
if (aChar == '1' && bChar == '1') {
if (add) {
sb.append("1");
} else {
sb.append("0");
}
add=true;
}
else if(aChar=='1'||bChar=='1'){
if (add) {
sb.append("0");
} else {
sb.append("1");
}
}
else if(aChar=='0'&&bChar=='0'){
if(add){
sb.append("1");
}
else{
sb.append("0");
}
add=false;
}
}
else if(aLen-1-i>=0){
char aChar = a.charAt(aLen - 1 - i);
if(aChar=='1'){
if(add){
sb.append("0");
}
else{
sb.append("1");
}
}
else{
if(add){
sb.append("1");
add=false;
}
else{
sb.append("0");
}
}
}
else if(bLen-1-i>=0){
char bChar = b.charAt(bLen - 1 - i);
if(bChar=='1'){
if(add){
sb.append("0");
}
else{
sb.append("1");
}
}
else{
if(add){
sb.append("1");
add=false;
}
else{
sb.append("0");
}
}
}
}
if(add){
sb.append("1");
}
sb.reverse();
return sb.toString();
}
}
官方题解
class Solution {
public String addBinary(String a, String b) {
StringBuffer ans = new StringBuffer();
int n = Math.max(a.length(), b.length()), carry = 0;
for (int i = 0; i < n; ++i) {
carry += i < a.length() ? (a.charAt(a.length() - 1 - i) - '0') : 0;
carry += i < b.length() ? (b.charAt(b.length() - 1 - i) - '0') : 0;
ans.append((char) (carry % 2 + '0'));
carry /= 2;
}
if (carry > 0) {
ans.append('1');
}
ans.reverse();
return ans.toString();
}
}
作者:力扣官方题解
链接:https://leetcode.cn/problems/add-binary/solutions/299667/er-jin-zhi-qiu-he-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
思考
好消息是我和官方题解的思路是一样的,坏消息是我发现自己对二进制、ASCII码的机制一无所知,我的专业是读到狗肚子里去了么?!真是难堪,但生活还是得继续,所以记录以下经验:
- '0'的ASCII码值是48
- '0'+1的值是49

浙公网安备 33010602011771号