leetcode add_binary 采坑记

尽管add_binary在leetcode中是一个简单难度,但是踩了不少坑,记录一下

描述:

给两个字符串形式的二进制数,要求求和并输出字符串形式的结果,其中a和b均不为空字符串

样例:

a=“1010”,b="1011",输出“10101”.

过程:

刚看到题目的时候觉得很简单,只要每一位按位相加就好了,很容易写出第一版代码

public class AddBinary {
    public String add_binary(String a,String b){
        char[] chars_a = a.toCharArray();
        char[] chars_b = b.toCharArray();
        
        int c_out = 0;

        // 统计最长位数,将chars_a设置为最长的
        int max_length = chars_a.length;
        if(chars_a.length<chars_b.length){
            max_length = chars_b.length;
            char[] temp = chars_a;
            chars_a = chars_b;
            chars_b = temp;
        }
        
        // 设置结果长度为长的那个
        char[] result = new char[max_length];
        // 计算结果
        for(int i=0;i<max_length;i++){
            int t;
            if(i<chars_b.length){
                // 重合部分
                t = chars_a[i]-'0'+chars_b[i]-'0'+c_out;
            }else {
                // 非重合部分
                t = chars_a[i]+c_out;
            }
            if(t>1){
                c_out = 1;
                result[i]=(char)(t-2);
            }else {
                c_out=0;
                result[i]=(char)t;
            }
        }
        StringBuilder stringBuilder = new StringBuilder();
        if(c_out!=0){
            stringBuilder.append(1);
        }
        stringBuilder.append(result);
        return stringBuilder.toString();
    }
}

  开心的测试了一下,结果输出的是什么东西,还有空白符,这就是不严谨的问题了,在设置result[i]的时候没有考虑到再加上‘0’的ASCII码值,导致输出的是0或者1对应的ASCII值结果,实验第二版代码

public class AddBinary {
    public String add_binary(String a,String b){
        char[] chars_a = a.toCharArray();
        char[] chars_b = b.toCharArray();

        int c_out = 0;

        // 统计最长位数,将chars_a设置为最长的
        int max_length = chars_a.length;
        if(chars_a.length<chars_b.length){
            max_length = chars_b.length;
            char[] temp = chars_a;
            chars_a = chars_b;
            chars_b = temp;
        }

        // 设置结果长度为长的那个
        char[] result = new char[max_length];
        // 计算结果
        for(int i=0;i<max_length;i++){
            int t;
            if(i<chars_b.length){
                // 重合部分
                t = chars_a[i]-'0'+chars_b[i]-'0'+c_out;
            }else {
                // 非重合部分
                t = chars_a[i]-'0'+c_out;
            }
            if(t>1){
                c_out = 1;
                result[i]=(char)(t-2+'0');
            }else {
                c_out=0;
                result[i]=(char)(t+'0');
            }
        }
        StringBuilder stringBuilder = new StringBuilder();
        if(c_out!=0){
            stringBuilder.append(1);
        }
        stringBuilder.append(result);
        return stringBuilder.toString();
    }
}

  结果显示都是数字了没问题,但是计算的结果为什么出错了,原因在于String.toCharArray(),是按照从左向右的顺序读入的,即第零位是二进制数的最高为,相当于反了过来,所以第三版代码出现了

public class AddBinary {
    public String add_binary(String a,String b){
        char[] chars_a = a.toCharArray();
        char[] chars_b = b.toCharArray();

        int c_out = 0;

        // 统计最长位数,将chars_a设置为最长的
        int max_length = chars_a.length;
        if(chars_a.length<chars_b.length){
            max_length = chars_b.length;
            char[] temp = chars_a;
            chars_a = chars_b;
            chars_b = temp;
        }

        // 设置结果长度为长的那个
        char[] result = new char[max_length];
        // 计算结果
        for(int i=0;i<max_length;i++){
            int t;
            if(i<chars_b.length){
                // 重合部分
                t = chars_a[max_length-i-1]-'0'+chars_b[chars_b.length-i-1]-'0'+c_out;
                System.out.println(chars_a[max_length-i-1]+","+chars_b[chars_b.length-i-1]+","+c_out+","+t);
            }else {
                // 非重合部分
                t = chars_a[max_length-i-1]-'0'+c_out;
                System.out.println(chars_a[max_length-i-1]+","+c_out+","+t);
            }
            if(t>1){
                c_out = 1;
                result[max_length-i-1]=(char)(t-2+'0');
            }else {
                c_out=0;
                result[max_length-i-1]=(char)(t+'0');
            }
        }
        StringBuilder stringBuilder = new StringBuilder();
        if(c_out!=0){
            stringBuilder.append(1);
        }
        stringBuilder.append(result);
        return stringBuilder.toString();
    }
}

  总算是ac了,感觉很是坑啊

猜你喜欢

转载自www.cnblogs.com/leaveMeAlone/p/9903215.html