?欢迎大家收看,请多多支持?
?关注小哇,和我一起成长?个人主页?
?目录
分析:?
数字层面分析⭐
字符串层面分析⭐
代码及运行结果分析:?
代码:⭐
运行结果:编辑⭐
具体分析:⭐
题目
分析:
数字层面分析
先来看在二进制中 1+0==1,0+0==0,1+1==0
如果两个多位的二进制数相加,就还要考虑是否向前一位进1的问题,显然上面的三个式子中只有 1+1==0是需要向前进一位的。
考虑了向前进位的问题,还要考虑当前位的数字相加是否要多加一个来自上一位进的1(即当前位的上一位如果进1了的话,那么当前位相加是需要加上这个进的 1):
前一位没有进 1 | 前一位进 1 | |
---|---|---|
1和0相加 | 1+0 == 1,不向前一位进1 | 1+0+1 == 0,向前进1 |
1和1相加 | 1+1 == 0,向前进1 | 1+1+1 == 1,向前进1 |
0和0相加 | 0+0 == 0,不向前进1 | 0+0+1 == 1,不向前进1 |
因此,我们可以知道1+0、0+0、1+1这三种情况的结果都有两种情况,
并且,当 1+1 相加的时候,一定会向前进一位,
0+0 相加的时候,一定不会进一位,
而 0+1 时,就会有进一位和不进一位两种情况,即它的上一位的两个数相加进了一位,那么0+1才会向前进一位;它的上一位两个数没有向前进位,那么0+1就不会进位
字符串层面分析
计算数字时我们都会右对齐来计算,但是在代码中我们习惯从左到右来分析解决问题,因此我们可以将字符串反转,计算完后在反转回来就能够得到原来的字符串相加的结果
这里需要用到StringBuilder类和StringBuffer类的reverse()方法来反转字符串,它会修改调用的对象,而不是新建一个对象:
str.reverse();//将字符串str反转
两个字符串的长度如果不相同,我们可以给较短的字符串反转之后再末尾添加上'0'来计算,并且不会影响结果。
str.append("hello");//给字符串str尾部追加一个hello
代码及运行结果分析:
代码:
import java.util.Scanner;public class Test { public static void main(String[] args) { //:输入两个字符串a和b,字符串内容为二进制数字,求两个字符串相加的结果, // 加法计算方法以二进制方式计算,并返回对应的字符串结果。要求程序尽可能的高效。 //字符串长度不超过100 Scanner in = new Scanner(System.in); while(in.hasNextLine()){ String str1 = in.nextLine(); String str2 = in.nextLine(); Solution solution = new Solution(); String ret = solution.solve(str1,str2); System.out.println(ret); } } static class Solution { public String solve(String str1, String str2) { int len1 = str1.length(); int len2 = str2.length(); int maxLen = Math.max(len1,len2); StringBuilder strB1 = new StringBuilder(str1).reverse(); StringBuilder strB2 = new StringBuilder(str2).reverse(); StringBuilder str = new StringBuilder(); Boolean flag = false;//代表不进位 for(int i = 0;i < maxLen;i++){ char ch1 = i< len1?strB1.charAt(i):'0'; char ch2 = i< len2?strB2.charAt(i):'0'; if(ch1=='0'&&ch2=='0'){ str.append(flag?'1':'0'); flag = false;//相加为0,不用进一 }else if(ch1 == '1'&& ch2 == '1'){ str.append(flag?'1':'0'); flag = true; //相加要进1 }else{ str.append(flag?'0':'1');//注意 } } if(flag == true){ str.append('1'); } return str.reverse().toString(); } }}
运行结果:
可以看到我们成功解决了这个题目
具体分析:
StringBuilder strB1 = new StringBuilder(str1).reverse(); StringBuilder strB2 = new StringBuilder(str2).reverse();
这两行代码就第一行来说,
new StringBuilder(str1)创建了一个StringBuilder类的对象,并将对象的内容初始化为字符串str1的内容,然后再.reverse()将内容反转。strB1变量引用了这个对象。
char ch1 = i< len1?strB1.charAt(i):'0';char ch2 = i< len2?strB2.charAt(i):'0';
这两行代码是来判定是否需要给当前为添加一个0:
注意相加过程的0和1相加的代码,由前面的数字层面分析我们知道,0和1相加是否需要进1取决于它的上一位相加是否进1,所以我们不需要在这里写flag = true或者false,写了就会错
if(ch1=='0'&&ch2=='0'){ str.append(flag?'1':'0'); flag = false;//相加为0,不用进一}else if(ch1 == '1'&& ch2 == '1'){ str.append(flag?'1':'0'); flag = true; //相加要进1}else{ str.append(flag?'0':'1');//注意}
代码的后面写这个,是因为当字符串最后两个0或1相加完后,如果是两个1相加就还要再进1
if(flag == true){ str.append('1'); }
??本次题目分析结束啦,感谢支持!
如有高见,来评论区发言吧~?
?喜欢请三连哦❤️,再次感谢!