题目:
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.
Example 1:
Input: a = “11”, b = “1”
Output: “100”
Example 2:
Input: a = “1010”, b = “1011”
Output: “10101”
解答:
解法一:
首先想到了用以下方法,思路为:
(1)对字符串等长位数进行求和,使用temp表示进位数。
(2)每一对应位的真实求和current= 进位数+a字符串同位置的值+b字符串同位置的值
(3)进位数 temp= current/2
(4)结果值result = 进位值temp与之前的结果值result拼接
class Solution {
public String addBinary(String a, String b) {
//调整字符串a、b的顺序,使a字符串始终是最长的
if(a.length()<b.length()){
String c=a;
a=b;
b=c;
}
int al=a.length()-1;
int bl=b.length()-1;
int current=0; //当前位加和
int temp=0; //进位数
String result=""; //最终计算结果
while(bl>=0){
//ASCII码相减,char'0'的十进制数值为48,(a.charAt(al) -'0') 算出a字符串在al位置的十进制数值,将字符串类型转换成int类型
current=(a.charAt(al)-'0')+(b.charAt(bl)-'0')+temp;
temp=current/2;
result=current%2+result;
al--;
bl--;
}
while(al>=0){
current=(a.charAt(al)-'0')+temp;
temp=current/2;
result=current%2+result;
al--;
}
if(temp==1){
result=temp+result;
}
return result;
}
}
其中要注意char数据类型的计算
char类型是可以运算的,因为char在ASCII等字符编码表中有对应的数值。
在JAVA中,对char类型字符运行时,直接当做ASCII表对应的整数来对待。
char m='a'; //a
char m='a'+'b'; //? (char类型相加,提升为int类型,输出对应的字符,a和b分别对应的数值为97和98,相加等于195,其对应的字符为?)
int m='a'+'b'; //195(没有超出int范围,直接输出195)
char m=197; //?(输出字符编码表中对应的字符)
char m='197; //报错,因为有单引号,表示是字符,只允许放单个字符。
char m='a'+1; //b(提升为int,计算结果98对应的字符是b)
char m='中'+'国'; //42282
char m='中'+'国'+'国'+'国'; //报错(int转char有损失,因为结果已经超出char类型的范围)
int m='中'+'国'+'国'+'国'; //86820
char m='中'+1; //丮(1是int,结果提升为int,输出对应的字符)
char m='中'+"国"; //报错,String无法转换为char。
System.out.println('中'+"国"); //中国,没有变量附值的过程。String与任何字符用“+”相连,转换为String。
用单引号’ '标识,只能放单个字符。
char+char,char+int——类型均提升为int,附值char变量后,输出字符编码表中对应的字符。
char a = 97; //为char类型变量 a 赋值常量值 97。
char b = 'a'+3; //d(97+3=100,ASCII对应的字符为d)
char c = a+3; //报错,无法从int类型转换为char类型
char c=(char)(a+3); //d
//(可以认为' a '=97),常量(97)与常量(3)运算得到一个新的常量(100),常量赋值给变量(b),不存在强制转换,只要这个接受变量(b)的类型范围大于这个常量即可。而变量声明时需要定义数据类型(例:char a),内存就为这个变量划分一个char类型大小的空间,其中变量(a)的值是可变的,而常量(3)的值是不变的,两个运算得到的还是一个变量,本例中(a+3)是int类型的变量,而int类型变量(a+3)赋值给char类型变量(c)需要强制转换,因此会报错。
在jvm内存机制中,char类型数据运算是将字符在ASCII表对应的整数以int类型参与运算
解法二:
参考他人解法,一个稍微优化的解法:
使用一个while循环完成所有的相加操作,当a或者b的长度>=0时,当短的加完的时候,两个if会只相加长的剩余二进制,另外一个if不执行。
class Solution {
public String addBinary(String a, String b) {
StringBuffer sb=new StringBuffer();
int al=a.length()-1;
int bl=b.length()-1;
int temp=0; //进位
while(al>=0||bl>=0){
int sum=temp;
if(al>=0){
sum+=a.charAt(al)-'0';
al--;
}
if(bl>=0){
sum+=b.charAt(bl)-'0';
bl--;
}
sb.append(sum%2);
temp=sum/2;
}
if(temp==1){
sb.append(1);
}
return sb.reverse().toString();
}
}
StringBuffer的append()方法
StringBuffer其实是动态字符串数组,append()是往动态字符串数组添加,跟“xxxx”+“yyyy”相当那个‘+’号,跟String不同的是StringBuffer是放一起的。String1+String2 和Stringbuffer1.append(“yyyy”)虽然打印效果一样,但在内存中表示却不一样。
String1+String2 存在于不同的两个地址内存
Stringbuffer1.append(Stringbuffer2)放在一起
StringBuffer的reverse()方法
public StringBuffer reverse()将此字符序列用其反转形式取代。