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();

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值