二进制求和(LintCode)

作者: 木华 | 来源:发表于2016-04-25 15:59 被阅读903次

    二进制求和


    1 题目复现

    1)描述

    给定两个二进制字符串,返回他们的和(用二进制表示)。
    

    2)样例

    a = 11
    b = 1
    返回 100
    

    2 简单实现(C++)

    <code>
    class Solution
    {
    public:
    /**
    * @param a a number
    * @param b a number
    * @return the result
    */
    string addBinary(string& a, string& b)
    {
    string result = "";
    int c = 0, num = 0;
    int i = a.size() - 1, j = b.size() - 1;
    for (; i >= 0 && j >= 0; i--, j--)
    {
    num = (a[i] - '0') + (b[j] - '0') + c;
    c = num / 2;
    num = num % 2;
    result += ('0' + num);
    }
    for (; i >= 0; i--)
    {
    num = (a[i] - '0') + c;
    c = num / 2;
    num = num % 2;
    result += ('0' + num);
    }
    for (; j >= 0; j--)
    {
    num = (b[j] - '0') + c;
    c = num / 2;
    num = num % 2;
    result += ('0' + num);
    }
    if (c != 0)
    {
    result += ('0' + c);
    }
    i = 0; j = result.size() - 1;
    while (i < j)
    {
    char temp = result[i];
    result[i] = result[j];
    result[j] = temp;
    i++; j--;
    }
    return result;
    }
    </code>

    3 进阶实现(JAVA)

    1)目标

    不使用“+”实现

    2)实现代码

    <code>
    public class Solution {

    public String addBinary(String a, String b) {
        // Write your code here
        if(a.equals("0") && b.equals("0")) return a;
        if(checkZero(a)) return delZeroes(b);
        if(checkZero(b)) return delZeroes(a);
        int asize = a.length();
        int bsize = b.length();
        int len = 0;
        if( asize > bsize) {
            b = addZeroes(b, asize-bsize);
            len = asize;
        } else {
            a = addZeroes(a, bsize-asize);
            len = bsize;
        } 
        String na = addBinaryXOR(a, b, len);
        String nb = addBinaryAND(a, b, len) + "0";
        return addBinary(na, nb);
    }
    private boolean checkZero(String c) {
        for(int i=0; i<c.length(); i++) {
            if(c.charAt(i)!='0')
            return false;
        }
        return true;
    }
    private String delZeroes(String d) {
        int len = d.length();
        int count = 0;
        while(d.charAt(count)=='0') {
            count++;
        }
        return d.substring(count, len);
    }
    private String addZeroes(String t, int n) {
        StringBuilder builder = new StringBuilder();
        while(n > 0) {
            builder.append('0');
            n--;
        }
        builder.append(t);
        return builder.toString();
    }
    private String addBinaryAND(String a, String b, int len) {
        StringBuilder builder = new StringBuilder();
        for(int i=0; i<len; i++) {
            if(a.charAt(i)=='1' && b.charAt(i)=='1')
            builder.append("1");
            else 
            builder.append( "0");
        }
        return builder.toString();
    }
    private String addBinaryXOR(String a, String b, int len) {
        StringBuilder builder = new StringBuilder();
        for(int i=0; i<len; i++) {
            if(a.charAt(i)==b.charAt(i))
            builder.append("0");
            else 
            builder.append("1");
        }
        return builder.toString();
    }
    

    }
    </code>

    相关文章

      网友评论

        本文标题:二进制求和(LintCode)

        本文链接:https://www.haomeiwen.com/subject/tqqqrttx.html