版权所有:Leetcode
Given two binary strings, return their sum (also a binary string).
For example,
a = "11"
b = "1"
Return "100"
.
方法一:
Runtime:
392 ms
直接将运算结果保存到较长的字符串中。
step1:主要计算长度等于较短的字符串长度的位数,将较短的字符串与较长的字符串相加,结果存放在较长字符串中
step2:主要计算较长字符串比较短字符串多出来的部分
step3:主要处理进位,若有进位则增加存放结果的较长字符串的长度
由于计算是从最低位算起的,而01字符串的最低位在最右边,所以需要先反转字符串,最后再将结果反转回去。
涉及到字符串修改,益用StringBuffer
public class Solution {
public String addBinary(String a, String b) {
StringBuffer minlen = new StringBuffer(a).reverse();
StringBuffer maxlen = new StringBuffer(b).reverse();
if(a.length() > b.length()){
StringBuffer tmp = minlen;
minlen = maxlen;
maxlen = tmp;
}
//step 1
boolean carry = false;
for(int i=0;i < minlen.length();i++){
if(carry == false){
if(minlen.charAt(i) != maxlen.charAt(i)){
maxlen.setCharAt(i, '1');
}else if(minlen.charAt(i) == '0'){
maxlen.setCharAt(i, '0');
}else{
maxlen.setCharAt(i, '0');
carry = true;
}
}else{
if(minlen.charAt(i) != maxlen.charAt(i)){
maxlen.setCharAt(i, '0');
}else if(minlen.charAt(i) == '0'){
maxlen.setCharAt(i, '1');
carry = false;
}else{
maxlen.setCharAt(i, '1');
}
}
}
//step 2
for(int i = minlen.length();i < maxlen.length();i++){
if(carry == true){
if(maxlen.charAt(i) == '1'){
maxlen.setCharAt(i, '0');
}else{
maxlen.setCharAt(i, '1');
carry = false;
}
}else{
break;
}
}
//step 3
if(carry == true)
maxlen.append('1');
return maxlen.reverse().toString();
}
}
方法二:
Runtime:
428 ms
结果存储在新的字符串中
public class Solution {
public String addBinary(String a, String b) {
a = new StringBuffer(a).reverse().toString();
b = new StringBuffer(b).reverse().toString();
String sum = "";
boolean carry = false;
for(int i=0;i < a.length() && i < b.length();i++){
if(carry == false){
if(a.charAt(i) != b.charAt(i)){
sum = "1" + sum;
}else if(a.charAt(i) == '0'){
sum = "0" + sum;
}else{
sum = "0" + sum;
carry = true;
}
}else {
if(a.charAt(i) != b.charAt(i)){
sum = "0" + sum;
}else if(a.charAt(i) == '0'){
sum = "1" + sum;
carry = false;
}else{
sum = "1" + sum;
}
}
}
int minlen = a.length(), maxlen = b.length();
String exceed = null;
if(minlen > b.length()){
minlen = b.length();
maxlen = a.length();
exceed = a.substring(minlen);
}else
exceed = b.substring(minlen);
StringBuffer sbexceed = new StringBuffer(exceed);
if(carry == true){
for(int i=0;i < sbexceed.length();i++){
if(carry == true)
switch(sbexceed.charAt(i)){
case '0':{sbexceed.setCharAt(i, '1');carry = false;break;}
case '1':{sbexceed.setCharAt(i, '0');break;}
}
else
break;
}
}
exceed = sbexceed.reverse().toString();
if(carry == true)
exceed = "1" + exceed;
sum = exceed.toString() + sum;
return sum;
}
}