这段时间看到一个面试题面试题是这样的:
(1) 给定两个只含有0和1字符的字符串,实现二进制加法。如:
String str1 = “101”
String str2 = “11”
实现binarySum(String s1,String s2),使得输入以上字符时返回字符串"1000"。
拿到这个需求之后 开始是一脸懵逼,后来仔细分析一下 其实不是那么的难。
首先想要去解决这个问题得知道 二进制加法是怎么回事,因此在这里普及一下二进制加法的知识。
101
011
————
1000
其实就是和十进制加法一样的,首先如果两个 二进制长度不一样的话,需要在高位添加0补齐,补齐到两个字符串一般长,然后呢 0+0 =0 1+0=1 1+1=0 进一位,进一位也就是进1。
所以基本搞清楚了 那么就开撸吧。
private static String binarySum(String s1,String s2){
StringBuilder sb=new StringBuilder();
int x=0;
int y=0;
int pre=0;//进位
int sum=0;//存储进位和另两个位的和
//如果两个数字 位数不一样, 那么在短的那个位数前边补0
while (s1.length()!=s2.length()){
if (s1.length()>s2.length()){
s2="0"+s2;
}else {
s1="0"+s1;
}
}
//"101" "11" -> "101" "011"
//开始从低位往高位加
for(int i=s1.length()-1;i>=0;i--){
x=s1.charAt(i)-'0'; //得出s1某个位置字符对应的int值
y=s2.charAt(i)-'0'; //得出s2某个位置字符对应的int值
sum=x+y+pre;// 从低位开始做加法
if (sum>=2){
//进位
pre=1;
sb.append(sum-2);
}else {
//没有进位
sb.append(sum);
pre=0;
}
}
// 如果最后溢出 则补1
if (pre==1){
sb.append("1");
}
return sb.reverse().toString();//翻转返回;
}