0. 题目描述
2. 题目分析
- 核心逻辑:位运算,带进位相加
涉及的关键点:
① 位操作,字符串转化为 char 类型
② 进位,每次位运算后的进位,最后一次进位
③ 字符串长度不一致 - 是否考虑溢出:
104 也即 1024 ,数值范围小于 216 ,个人认为不用考虑
3. 测试用例分析
- 简单例子
补充注意点:
① 关于String 索引 index 范围的测试
② 关于 StringBuffer 中 append(int i) 参数类型测试
③ 关于 StringBuffer 中 append(int i) 追加字符串位置的验证
public static void main(String[] args) {
String a = "hello";
System.out.println(a.length());
System.out.println(a.charAt(a.length() - 1));
StringBuffer sb = new StringBuffer("a");
sb.append(1);
System.out.println(sb);
}
结论:
① String字符串 索引范围 [0, str.length() - 1]
② 参数类型可以直接是int类型不用转化
③ append()方法在原有字符串后面追加内容
@Override
public synchronized StringBuffer append(float f) {
toStringCache = null;
super.append(f);
return this;
}
@Override
public synchronized StringBuffer append(double d) {
toStringCache = null;
super.append(d);
return this;
}
结论:
① StringBuilder 类中重载了基本数据类型和引用数据类型的append()方法
② 基本数据类型:boolean,char,byte,int,short,long,float,double
③ 引用数据类型:Object,String
④ 类类型:StringBuilder,AbstractStringBuilder(抽象类)
2. 复杂例子
4. 代码
版本①:超出时间限制
public String addBinary0(String a, String b) {
int i = a.length() - 1, j = b.length() - 1, cr = 0;
StringBuilder sb = new StringBuilder();
while(i >= 0 || j >= 0 || cr > 0){
int aa = i >= 0 ? a.charAt(i--) - '0' : 0;
int bb = j >= 0 ? b.charAt(j--) - '0' : 0;
cr = aa + bb + cr;
sb.append(cr % 2);
cr = cr / 2;
}
return sb.reverse().toString();
}
版本②:改进版本①合并中间变量(处理后的字符串的位)
public String addBinary(String a, String b){
int len = Math.max(a.length(), b.length());
StringBuilder sb = new StringBuilder();
int cr = 0;
for(int i = 0; i < len; i++){
cr += i < a.length() ? a.charAt(a.length() - 1 - i) - '0' : 0;
cr += i < b.length() ? b.charAt(b.length() - 1 - i) - '0' : 0;
sb.append(cr % 2);
cr /= 2;
}
sb = cr > 0 ? sb.append(cr) : sb;
return sb.reverse().toString();
}