题目:
Given two binary strings, return their sum (also a binary string).
思路与步骤:
原思路:
将两个string逐个字符相加,设置一个flag ,进位的话记 carry=1,反之 carry=0
需要处理的一些细节:
1. a 和 b 的 0, 1 是字符形式,要写成 '0', '1';flag 是 int 型,写成 0, 1.
2. 最后一位(即最高位)加完后若 carry 为1需要给 和 的最高位设为1,即 和 的位数比a和b中较大位数还多1.
3. 如果a和b的高位有0,加完之后要把和高位上的0去掉。
改进的思路:
看了别人的代码后发现原来的思路过于繁琐,现学习别人的简洁思路:
1. 用 StringBuilder sb = new StringBuilder();
2. StringBuilder可以append 进 int 型的元素;由于二进制的含义是满 2 进 1,所以还是采用加法运算。
如果和为2,则carry 为1,即 sum/2,sb 中加入的元素为0,即sum%2;和为1和0时情况一样。
编程遇到的问题:
1. 开始用的 char[] 型来储存和,加的时候从最低位开始,即数组下标最大处开始。结果发现由于最高位是否进1不确定,即数组的大小不确定,没有办法初始化数组,所以这个数据结构的选取失败。
2. 后来想到用 Stack ,但是最后返回是首先是无法转化成数组,然后发现输出的顺序并不是从栈顶开始(为什么,还没解决)。
3. 既然 stack 无法逆转,想到用 List ,解决了逆转的问题,即 Collections.reverse(myList); 最后遇到的问题是无法将List 转化成 String。此时我已经黔驴技穷,所以看了别人的解法,get了新的知识。
新知识学习:
StringBuilder
常用方法有:append(); length(); charAt(i); deleteCharAt(i); toString() 等。
编程实现:
我的啰嗦但很快的代码:
public class Solution {
public String addBinary(String a, String b) {
char[] achar = a.toCharArray();
char[] bchar = b.toCharArray();
int i = a.length()-1, j = b.length()-1, carry = 0;
StringBuilder sb = new StringBuilder();
for( ; i>=0 && j>=0; i--,j--){
if (achar[i] != bchar[j]) sb.append(carry==0 ? '1' : '0');
else if (achar[i]=='0' && bchar[j]=='0'){
sb.append(carry==0 ? '0' : '1');
carry = 0;
} else if (achar[i]=='1' && bchar[j]=='1'){
sb.append(carry==0 ? '0' : '1');
carry = 1;
}
}
while(i > j){
for( ; i>=0 && carry == 0; i--) sb.append(achar[i]);
for( ; i>=0 && carry == 1; i--){
sb.append(achar[i] == '0' ? '1' : '0');
carry = (achar[i] == '0' ? 0 : 1);
}
}
while(i < j){
for( ; j>=0 && carry == 0; j--) sb.append(bchar[j]);
for( ; j>=0 && carry == 1; j--){
sb.append(bchar[j] == '0' ? '1' : '0');
carry = (bchar[j] == '0' ? 0 : 1);
}
}
if(carry==1) sb.append('1');
sb.reverse();
while(sb.length()>1 && sb.charAt(0)=='0') sb.deleteCharAt(0);
return sb.toString();
}
}
学习别人的代码:
public class Solution {
public String addBinary(String a, String b) {
char[] achar = a.toCharArray();
char[] bchar = b.toCharArray();
int i = a.length()-1, j = b.length()-1, carry = 0;
StringBuilder sb = new StringBuilder();
while (i >= 0 || j >= 0) {
int sum = carry;
if (i >= 0) sum += achar[i--]-'0';
if (j >= 0) sum += bchar[j--]-'0';
sb.append(sum % 2);
carry = sum / 2;
}
if (carry == 1) sb.append(carry);
return sb.reverse().toString();
}
}