二进制求和
题目描述:
给定两个二进制字符串,返回他们的和(用二进制表示)。
输入为非空字符串且只包含数字 1 和 0。
示例 1:
输入: a = "11", b = "1"
输出: "100"
示例 2:
输入: a = "1010", b = "1011"
输出: "10101"
问题分析:
关于这个题,有两种大的解题思路:
1,作为使用 java 解答的算法题,可以直接使用字符函数进行操作,借助
StringBuilder res = new StringBuilder();
res.append(sum % 2);
res.reverse().toString();
三个函数,使用多种方法解答
2,将字符串转化为数组,使用数组加减后,传递进位,得到最后的数组,进行 Arrays.toString()
但是不推荐使用,很麻烦,而且没有必要
代码展示(已验证):
//leetcode-java
class Solution {
public String addBinary(String a, String b) {
int m = a.length() - 1;
int n = b.length() - 1;
int key = 0;
// 创建 res 对象
StringBuilder res = new StringBuilder();
// 借用 sum 处理 字符串
while (m > -1 || n > -1) {
int sum = key;
sum += m > -1 ? a.charAt(m--) - '0' : 0;
sum += n > -1 ? b.charAt(n--) - '0' : 0;
res.append(sum % 2);
key = sum / 2;
}
// 加上最后一个 key 值
res.append(key == 0 ? "" : key);
// 翻转后 以 String 形式 return
return res.reverse().toString();
// int[] a1= new int[a.length()];
// int[] b1 = new int[b.length()];
// // 将字符串 倒序 放入数组
// int n1=0;
// for(int i=a.length()-1; i>=0; i--)
// a1[i] = Integer.parseInt(String.valueOf(a.charAt(n1++)));
// int n2 =0;
// for(int j=b.length()-1; j>=0; j--)
// b1[j] = Integer.parseInt(String.valueOf(b.charAt(n2++)));
// int num = Math.min(a.length(), b.length());
// int num1 = Math.max(a.length(), b.length());
// int[] c = new int[num1];
// int key=0;
// for(int i=0; i< num; i++)
// {
// if(a1[i]+b1[i]+key >= 2)
// {
// c[i] = (a1[i]+b1[i]+key)%2;
// key = 1;
// }
// else
// {
// c[i] = a1[i]+b1[i]+key;
// key = 0;
// }
// }
// if(a.length() == b.length())
// {
// if(key == 1)
// {
// int[] d = new int[num1+1];
// int j=0;
// for(int i=num1-1; i>=0; i--)
// {
// d[j] = c[i];
// j++;
// }
// d[num1] = 1;
// return Arrays.toString(d);
// }
// else
// {
// int[] d = new int[num1];
// int j=0;
// for(int i=num1-1; i>=0; i--)
// {
// d[j] = c[i];
// j++;
// }
// return Arrays.toString(d);
// }
// }
// else if( a.length()>b.length() )
// {
// for(int j=num; j<num1; j++)
// {
// if(a1[j]+key >= 2)
// {
// c[j] = (a1[j]+key)%2;
// key = 1;
// }
// else
// {
// c[j] = a1[j] + key;
// key = 0;
// }
// }
// }
// else if(a.length() < b.length())
// {
// for(int j=num; j<num1; j++)
// {
// if(b1[j]+key >= 2)
// {
// c[j] = (b1[j]+key)%2;
// key = 1;
// }
// else
// {
// c[j] = b1[j] + key;
// key = 0;
// }
// }
// }
// // 将最后的进位,加进去
// if(key == 1)
// {
// int[] d = new int[num1+1];
// for(int i=0; i<num1; i++)
// {
// d[i] = c[i];
// }
// d[num1] = 1;
// // 需要一次翻转
// int[] e = new int[num1+1];
// int j=0;
// for(int i=num1; i>=0; i--)
// {
// e[j] = d[i];
// j++;
// }
// return Arrays.toString(e);
// }
// else
// {
// int[] d = new int[num1];
// for(int i=0; i<num1; i++)
// {
// d[i] = c[i];
// }
// //需要一次翻转
// int[] e = new int[num1];
// int j=0;
// for(int i=num1-1; i>=0; i--)
// {
// e[j] = d[i];
// j++;
// }
// return Arrays.toString(e);
// }
}
}
泡泡:
解答这个题的时候,先用了 第二种方法,真的是做的欲哭无泪,到后来真正用java中函数写的时候,觉得真的是太浪费了,所以注意使用的
方法,以及这个方法的使用是否更简单,效率更高,当然,实践最能看出问题,哈哈。