67. Add Binary
Given two binary strings, return their sum (also a binary string).
The input strings are both non-empty and contains only characters 1 or 0.
Input: a = “11”, b = “1”
Output: “100”
两个二进制数求和,返回结果的二进制字符串表示。
方法1:2ms
二进制相加
:进位=(各位相加+前一位的进位)% 2
, 各位值=(各位相加+前一位的进位)/ 2
两个字符串长度不相等时,相加无需额外补零。
在循环中,从字符串尾部
开始读,标志位不断减一。循环条件将两个标志位 i>=0、j>=0 的条件或
在一起,是为了保证若一个字符串读完,另一个字符串还没读完时不停止循环,还可继续按各位相加,只不过已读完的那个字符串中被加位的是0。
条件运算符(?:)
variable x = (expression) ? value if true : value if false
三元运算符。该运算符有3个操作数,并且需要判断布尔表达式的值。该运算符的主要是决定哪个值应该赋值给变量。
如:b = (a == 1) ? 20 : 30
前缀自增自减法(++a,--a)
: 先进行自增或者自减运算,再进行表达式运算
后缀自增自减法(a++,a--)
: 先进行表达式运算,再进行自增或者自减运算
int b = ++a; 拆分运算过程为: a=a+1=4; b=a=4, 最后结果为b=4,a=4
int d = –c; 拆分运算过程为: c=c-1=2; d=c=2, 最后结果为d=2,c=2
public String addBinary3(String a, String b) {
int i = a.length() - 1;
int j = b.length() - 1;
int carry = 0; //进位
StringBuilder sb = new StringBuilder();
while (i >= 0 || j >= 0 || carry > 0){
int sum = 0; //每位的加和,包括进位
sum += (i >= 0) ? a.charAt(i--) - '0' : 0;
sum += (j >= 0) ? b.charAt(j--) - '0' : 0; // j--先进行表达式运算,再进行自增运算
sum += carry;
carry = sum / 2;
sb.append(sum % 2); //apend
}
return sb.reverse().toString(); //reverse()反转
}
方法2:3ms
没使用条件运算符
计算结果时,是直接在字符串首insert()。方法1是在字符串尾append(),最后再将字符串反转reverse()
public String addBinary(String a, String b) {
int i = a.length() - 1;
int j = b.length() - 1;
int carry = 0; //进位
StringBuilder sb = new StringBuilder();
while (i >= 0 || j >= 0){
int sum = 0;
if (i >= 0)
sum += a.charAt(i--) - '0';
if (j >= 0)
sum += b.charAt(j--) - '0'; // j--先进行表达式运算,再进行自增运算
sum += carry;
carry = sum / 2;
sb.insert(0, sum % 2);
}
if (carry == 1)
sb.insert(0, 1);
return sb.toString();
}
方法3:5ms 很麻烦。。
字符串前补零,本来想用String.format(“%04d”, Number),但是Integer.parseInt(s)当string太长就会超出int范围报错
java中数字左侧补零
public String addBinary2(String a, String b) {
int len = Math.max(a.length() , b.length());
String str1 = "", str2 = "";
for (int i = 0; i < len - a.length(); i++) {
str1 = "0" + str1;
}
for (int i = 0; i < len - b.length(); i++) {
str2 = "0" + str2;
}
StringBuilder sb1 = new StringBuilder(a);
String newa = sb1.insert(0, str1).toString();
StringBuilder sb2 = new StringBuilder(b);
String newb = sb2.insert(0, str2).toString();
char[] awords = newa.toCharArray();
char[] bwords = newb.toCharArray();
StringBuilder sb = new StringBuilder();
int flag = 0; //进位
for (int i = len - 1; i >= 0; i--) {
int A = awords[i] - '0';
int B = bwords[i] - '0';
if (A + B + flag >= 2){
sb.insert(0, A + B + flag - 2);
flag = 1;
}
else {
sb.insert(0, A + B + flag);
flag = 0;
}
}
if (flag == 1)
sb.insert(0, 1);
return sb.toString();
}