LeetCode-二进制求和(67)
这个题目并不算难,但是我花的时间并不短,原因是一开始没想到用一个变量来表示进位.
思路
- 首先,新建一个StringBuilder类型的变量用来返回结果,用一个变量level来表示是否有进位.
- 无进位的时候:
- 同为0,则为0.
- 同为1,则为0,进位.
- 不同,则为1.
- 有进位的时候:
- 同为0,则为1.不进位
- 同为1,则为1.进位
- 不同,则为0.不进位
- 考虑一个字符串结束的情况.一个字符串遍历结束时,另一个字符串所剩的长度就是L长-L短,然后把剩下的字符串跟返回结果合并就是了.
- 如果遍历完了所有的字符,需要判断一下是否还有进位,如果有,需要再追加个1.
代码
StringBuilder str = new StringBuilder();
int level = 0; //是否有进位
int al = a.length();
int bl = b.length();
if(al>bl){
return addBinary(b,a);
}
for(int i=0;i< al;i++){
String ac = a.substring(al-1-i,al-i);
String bc = b.substring(bl-1-i,bl-i);
if(level==0){ //无进位
if(ac.equals(bc) && "0".equals(ac)){
str.append("0");
}else if(ac.equals(bc) && "1".equals(ac)){
str.append("0");
level = 1;
}else{
str.append("1");
}
}else{ //有进位
if(ac.equals(bc) && "0".equals(ac)){
str.append("1");
level = 0;
}else if(ac.equals(bc) && "1".equals(ac)){
str.append("1");
}else{
str.append("0");
}
}
//a结束
if(i==al-1){
for(int j=0;j<bl-al;j++){
String bcc = b.substring(bl-al-1-j,bl-al-j);
if(level==0){
str.append(bcc);
}else{
if(bcc.equals("0")){
str.append("1");
level = 0;
}else{
str.append("0");
}
}
}
if(level==1){
str.append("1");
}
break;
}
}
return str.reverse().toString();
结束语
谋定而后动,磨刀不误砍柴工.先把各种情况尽可能考虑全面了再敲代码比直接动手要好很多.
哪怕再简单的程序,考虑的很全面了,想要编码完成一次通过也不容易,可以使用Idea等工具进行调试,避免因为简单的错误耽误大量的时间.