67.[LeetCode]Add Binary

一开始我是有两个思路的,第一个是直接在字符位来计算,第二个是先转化为int整型,然后计算,再转换为String,这个想法 明显忽略掉 超过32的大数的可能。设计算法要考虑可能的范围

我的算法 : 耗时 6ms

public class Solution {
    public String addBinary(String a, String b) {
        // 先求出两个字符串哪个的位数比较长
        int length_a = a.length();
        int length_b = b.length();
        String newNum = "";
        // 给短的字符串补零
        if(length_a > length_b){
            char[] s_0 = new char[length_a - length_b];
            Arrays.fill(s_0,'0');
            String s = new String(s_0);
            b = s + b;
            length_b = b.length();
        } else {
            char[] s_0 = new char[length_b - length_a];
            Arrays.fill(s_0,'0');
            String s = new String(s_0);
            a = s + a;
            length_a = a.length();
        }
        // 计算
        int carry = 0;
        int a_int=0,b_int=0;
        for(int i = length_a-1;i>=0;i--){
            a_int = a.charAt(i)-'0';
            b_int = b.charAt(i)-'0';
            int sum = a_int+b_int+carry;
            int k = 0;
            switch(sum){
                case 0:
                    k = 0;
                    carry = 0;
                    break;
                case 1:
                    k = 1;
                    carry = 0;
                    break;
                case 2:
                    k = 0;
                    carry = 1;
                    break;
                case 3:
                    k = 1;
                    carry = 1;
                    break;
            }
            // add k to string
            newNum = String.valueOf(k)+newNum;
        }
        if(carry == 1){
            newNum = String.valueOf(1)+newNum;
        }
        return newNum;
    }
}

在如何补零那里研究了一会,可以通过charset来初始化一个stirng,而一个charset可以用 Arrays.fill(charset,'x') 来填满


大神的代码,简洁干净,只要2ms

public class Solution {
    public String addBinary(String a, String b) {
        // 交换,使得a为长的,b为短的
        // 这是一个很好的策略,在不知道那个是长的,哪个是短的情况下,不如先交换确定
        String temp="";
        if(a.length()<b.length()){
            temp=a;
            a=b;
            b=temp;
        }

        // 我上面的方法是不断的使用charAt来获取字符串中的某一个字符,但是明显是先 转化为 字符数组 更加的高效
        char[] arA=a.toCharArray();
        char[] arB=b.toCharArray();
        char[] arC=new char[a.length()+1];

        int i=a.length()-1;
        int j=b.length()-1;
        int carry=0;
        int tempSum=0;
        while(i>=0){
            if(j>=0){
                tempSum=arA[i]-'0'+arB[j]-'0'+carry;
                --j;
            }
            else{
                tempSum=arA[i]-'0'+carry;
            }
            carry=tempSum/2;
            arC[i+1]=(char)(tempSum%2+'0');
            --i;
        }
        // 如果有进位,则返回全部,如果没有进位,则返回部分
        arC[i+1]='1';
        if(carry>0){ 
            return String.valueOf(arC);
        }
        else{
            return String.valueOf(arC).substring(1,a.length()+1);
        }
    }
}       
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值