leetcode题记:Add Binary
编程语言:JAVA
题目描述:
Given two binary strings, return their sum (also a binary string).
The input strings are both non-empty and contains only characters 1 or 0.
Example 1:
Input: a = "11", b = "1"
Output: "100"
Example 2:
Input: a = "1010", b = "1011"
Output: "10101"
提交反馈:
294 / 294 test cases passed.
Status: Accepted
Runtime: 26 ms
Submitted: 0 minutes ago
You are here!
Your runtime beats 2.62 % of java submissions.
解题思路:
博主自认为解题思路较清晰、简单。但是无奈,提交后的运行时间太久,属于垫底的水平。
解题思路主要有以下几步:
1、将a赋值为较长的字符串,b赋值为较短的字符串(方便后面操作)
2、将两个字符串补0对齐,使其长度变为一样长
3、设置一个进位flag,flag初始化为0
4、用a.charAt(i)-48、b.charAt(i)-48分别求出这两个值,并与flag求和,计为sum
5、若sum=3,对应位置值为1,flag置1;若sum=2,对应位置值为0,flag置1;若sum=1,对应位置值为1,flag置0;若sum=0,对应位置值为0,flag置0;
6、用StringBuffer的append()方法向末尾添加字符串,然后用StringBuffer的reverse()方法逆置,用StringBuffer的toString()方法转化为字符串;
但是经过提交结果,发现,这个方法运行时间比较久,上网查看大神代码。
代码:
class Solution {
public String addBinary(String a, String b) {
// 将a赋值为叫=较长的字符串,b赋值为较短的字符串
if(a.length() < b.length()){
String tmp = a;
a = b;
b = tmp;
}
// 将两个字符串对齐,长度补0变为一样长
int cha = a.length()-b.length();
StringBuffer s0 = new StringBuffer();
int i = 0;
while(i < cha){
s0.append("0");
i += 1;
}
b = s0.toString() + b;
// 定义一个存储结果的StringBuffer
StringBuffer res = new StringBuffer();
// 将两个长度相等的字符串相加,定义一个进位标志flag
int flag = 0;
int j = b.length() - 1;
while(j >= 0){
int a_curr = a.charAt(j)-48;
int b_curr = b.charAt(j)-48;
int sum = flag + a_curr + b_curr;
if(sum == 2){
res = res.append("0");
flag = 1;
}
else if(sum == 3){
res = res.append("1");
flag = 1;
}
else{
String s_tmp = String.format("%s",sum);
res = res.append(s_tmp);
flag = 0;
}
j -= 1;
}
// 判断进位flag是否为0,否则前面补0
if(flag == 1){
res = res.append("1");
}
return res.reverse().toString();
}
}
代码改进:
当我将对应部分改为下面斜杠部分所示时,运行时间神奇的缩短了
294 / 294 test cases passed.
Status: Accepted
Runtime: 3 ms
You are here!
Your runtime beats 41.22 % of java submissions.
仅仅做了这么一小点的改动,平均运行时间由原来的26毫秒缩短到23毫秒,难以想象,真的是很可怕的一个数字啊。
我做了实验,运行十次String.format(),发现十次的这个操作竟然需要14ms,
所以啊,在以后的程序中,尽量能不用String.format()就不用吧,这个函数的性能太低了。
class Solution {
public String addBinary(String a, String b) {
// 将a赋值为叫=较长的字符串,b赋值为较短的字符串
if(a.length() < b.length()){
String tmp = a;
a = b;
b = tmp;
}
// 将两个字符串对齐,长度补0变为一样长
int cha = a.length()-b.length();
StringBuffer s0 = new StringBuffer();
int i = 0;
while(i < cha){
s0.append("0");
i += 1;
}
b = s0.toString() + b;
// 定义一个存储结果的StringBuffer
StringBuffer res = new StringBuffer();
// 将两个长度相等的字符串相加,定义一个进位标志flag
int flag = 0;
int j = b.length() - 1;
while(j >= 0){
int a_curr = a.charAt(j)-48;
int b_curr = b.charAt(j)-48;
int sum = flag + a_curr + b_curr;
if(sum == 2){
res = res.append("0");
flag = 1;
}
else if(sum == 3){
res = res.append("1");
flag = 1;
}
///////////////////////////////////////////////////////////////
else if(sum == 1){
res = res.append("1");
flag = 0;
}
else{
res = res.append("0");
flag = 0;
}
///////////////////////////////////////////////////////////////
j -= 1;
}
// 判断进位flag是否为0,否则前面补0
if(flag == 1){
res = res.append("1");
}
return res.reverse().toString();
}
}
还没有评论,来说两句吧...