创建时间: November 23, 2021 3:07 PM
最后编辑时间: November 23, 2021 3:42 PM
标签: 位运算, 字符串, 数学
状态: 已完成
网址: https://leetcode-cn.com/problems/JFETK5/
难度: 简单
题目
输入两个表示二进制的字符串,请计算它们的和,并以二进制字符串的形式输出。例如,输入的二进制字符串分别是"11"和"10",则输出"101"。
分析
这里不能将字符串转换成整型进行计算,因为字符串长度是无限的,转成int或者long都可能会溢出,因此还是得使用字符串进行计算。右端对齐,逢二进一
String,StringBuilder和StringBuffer之间的区别
- String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,这样不仅效率低下,而且大量浪费有限的内存空间,所以经常改变内容的字符串最好不要用 String
- StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。
- StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。
- 由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类。
代码
class Solution {
public String addBinary(String a, String b) {
int aIndex=a.length()-1;
int bIndex=b.length()-1;
StringBuilder sb=new StringBuilder();
//两个加数
int aa,bb;
//进位
int c=0;
//每位上的和
int sum=0;
while(aIndex>=0 || bIndex>=0){
if(aIndex>=0)aa=a.charAt(aIndex--)-'0';
else aa=0;
if(bIndex>=0)bb=b.charAt(bIndex--)-'0';
else bb=0;
sum=aa+bb+c;
if(sum>1){
sum-=2;
c=1;
}
else{
c=0;
}
sb.append(sum);
}
if(c==1)sb.append(c);
return sb.reverse().toString();
}
}
上述代码思路是对的,但是代码有些繁琐了,if...else...
语句可以用三目运算符:?
替换,以下是书中给的解法
class Solution {
public String addBinary(String a, String b) {
StringBuilder result=new StringBuilder();
int i=a.length()-1;
int j=b.length()-1;
int carry=0;//进位
while(i>=0 || j>=0){
int digitA=i>=0?a.charAt(i--)-'0':0;
int digitB=j>=0?b.charAt(j--)-'0':0;
int sum=digitA+digitB+carry;
carry=sum>=2?1:0;
sum=sum>=2?sum-2:sum;
result.append(sum);
}
if(carry==1){
result.append(1);
}
return result.reverse().toString();
}
}