67.[LeetCode]Add Binary

来源:互联网 发布:淘宝二手镜头靠谱吗 编辑:程序博客网 时间:2024/06/06 15:10

一开始我是有两个思路的,第一个是直接在字符位来计算,第二个是先转化为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
原创粉丝点击