【Leetcode Algorithm】Add Binary

来源:互联网 发布:实况埃芬博格数据 编辑:程序博客网 时间:2024/06/05 03:23

Given two binary strings, return their sum (also a binary string).

For example,
a = "11"
b = "1"
Return "100".


自己的代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
public class Solution {
    public static String addBinary(String a, String b) {
        //计算字符串a,b的长度
        int a_len = a.length();
        int b_len = b.length();
        //程序默认a_len不小于b_len,如果a_len<b_len,则调换两个字符串
        if(a_len < b_len){
            String c = a;
            a = b;
            b = c;
            int tmp_len = a_len;
            a_len = b_len;
            b_len = tmp_len;
        }
        //新建一个数组,用来存放两个二进制数的和,长度比a_len大1
        int[] sum = new int[a_len+1];
        int add_value1;
        int add_value2;
        int jinwei = 0;
        //分别倒序取出字符串a,b的数,然后相加,算出进位
        for(int i=a_len-1,j=b_len-1;i>=0&&j>=0;i--,j--){
            add_value1 = Integer.parseInt(String.valueOf(a.charAt(i)));
            add_value2 = Integer.parseInt(String.valueOf(b.charAt(j)));
            sum[i+1] = (add_value1 + add_value2 + jinwei)%2;
            jinwei = (add_value1 + add_value2 + jinwei)/2;
        }
        //计算剩下的a_len-b_len个数与进位的和
        for(int k=a_len-b_len;k>=0;k--){
            if(k>0){
                sum[k] = Integer.parseInt(String.valueOf(a.charAt(k-1)));
            }
            add_value1 = sum[k];
            sum[k] = (add_value1 + jinwei)%2;
            jinwei = (add_value1 + jinwei)/2;
        }
        //将得出的和,写入StringBuffer
        StringBuffer sb = new StringBuffer();
        for(int n=0; n<a_len+1; n++){
            //如果首部出现连续的两个0,则直接返回0;如果首部只出现一个0,则直接进行下一次循环
            if(n==0&&sum[n]==0){
                if(sum[1]==0){
                    return String.valueOf(0);
                }
                continue;
            }
            sb.append(sum[n]);
        }
        //将StringBuffer中的和转换成字符串输出
        return sb.toString();
    }
}

别人的代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public class Solution {
    public static String addBinary(String a, String b) {
        int i = a.length() - 1;     // i指向a的末尾
        int j = b.length() - 1;     // j指向b的末尾
        int c = 0;      // carry 进位
        // 先把String转为char数组便于处理
        char[] achar = a.toCharArray();
        char[] bchar = b.toCharArray();
        // 结果数组
        char[] reschar = new char[Math.max(achar.length, bchar.length)+1];
        int k = 0;      // k指向结果数组的开头
        while(true){
            if(i<0 && j<0 && c==0){
                break;
            }
            int aint = 0;
            int bint = 0;
               
            if(i >= 0){
                aint = achar[i] - '0';
            }
            if(j >= 0){
                bint = bchar[j] - '0';
            }
            if(aint + bint + c > 1){
                reschar[k] = (char) ('0' + aint + bint + c - 2);
                c = 1;
            }else{
                reschar[k] = (char) ('0' + aint + bint + c);
                c = 0;
            }
            k++;
            i--;
            j--;
        }
         // char数组转string,然后翻转
        return new StringBuffer(new String(reschar, 0, k)).reverse().toString();
    }
}
第13行太精妙了,赞赞赞

0 0
原创粉丝点击