这题我没有做出来,我的原本方法是两个都转成十进制,然后相加然后再转换成二进制
这是我写的二进制转十进制
static int toto10(String a) {
int u;
double tena;
int outa = 0;
for (int i = 0; i < a.length(); i++) {
u = a.charAt(i) - '0';
tena = u * Math.pow(2, a.length() - 1 - i);
// u = (int) u;
outa = outa + (int) tena;
}
return outa;
}
这是我写的十进制转为二进制
static String tento2(int n) {
String str = "";
while (n != 0) {
str = n % 2 + str;
n = n / 2;
}
return str;
}
但是运行中间,就是有那种整数溢出的问题,目前还没有想到方法解决,看了一下标准答案之一。
标准答案
思路:
先创建字符串变量而不是标量,继而每次按位取字符串相加,是1的话就有进位;
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; //取a的一位数,这里是从低位到高位
carry += i < b.length() ? (b.charAt(b.length() - 1 - i) - '0') : 0;
ans.append((char) (carry % 2 + '0'));//这里是从高位开始填充的,这里的高低位指的是✖2的指数的大小高低
carry /= 2;
}
if (carry > 0) {
ans.append('1');
}
ans.reverse(); //需要反转,因为上面的字符串变量填充的方向和2进制的运算规则是反的
return ans.toString();
}
}