leetcode Add Binary (easy) /java

二进制的加法

经过测试之后,发现没有考虑整型数据溢出。

leetcode经常会有一些意想不到的例外。我以为是一道解法很丰富的题,选择了:把string转为int,用int的加法,再转为string返回。因为我讨厌用字符串来进位。但是溢出了。可以改进一下,用BigInteger这个类。

先贴上我的错误代码。

import java.io.*;
import java.util.*;
import java.lang.*;
public class Solution {
    public static int toInt(String s)
    {
        int len=s.length();
        int i=0,r=0;
        char[] c=s.toCharArray();
        for(i=0;i<len;i++)
        {
            r=r*2+c[i]-'0';
        }
        return r;
    }
    public static String toStr(int n)
    {
        String s=new String();
        int x=n;
        while(x!=0)
        {
            if(x%2==0)
                s=s+"0";
            else
                s=s+"1";
            x=x/2;
        }
        int len=s.length();
        char[] c=s.toCharArray();
        char[] b=new char[len];
        int i=0;
        for(i=0;i<len;i++)
        {
            b[i]=c[len-1-i];
        }
        String r=String.valueOf(b);
        return r;
    }
    public static String addBinary(String a, String b) {
        if(a==null)
            return b;
        if(b==null)
            return a;
        return toStr(toInt(a)+toInt(b));
    }
    public static void main(String[] args)
    {
        //System.out.println(addBinary("11","1"));
        System.out.println(addBinary("1010","1011"));
    }
}

改为BigInteger版本后,错误是

一口老血。

虽然很气可是也仍然要微笑呀:)

测试:

 然后我发现一件神奇的事情

如图所示,我输入的数字是以1结尾的二进制数据,然而这个网站竟然给我一个偶数。我首先怀疑的是我自己。难道是我自己出错了吗?

把问题反馈给开源中国。事实上,我测试了好几个数值大的数据,给出的结果都不对。

于是,我开始用二进制手动进位。

(很难受)

import java.io.*;
import java.util.*;
import java.lang.*;

public class Solution {
    public static String reverse(String s)
    {
        int len=s.length();
        char[] c=s.toCharArray();
        char[] b=new char[len];
        int i=0;
        for(i=0;i<len;i++)
        {
            b[i]=c[len-1-i];
        }
        String r=String.valueOf(b);
        return r;
    }
    public static String addBinary(String a, String b) {
        if(a==null||a.equals("0"))
            return b;
        if(b==null||b.equals("0"))
            return a;
        int len1=a.length();
        int len2=b.length();
        int len;
        if(len1<len2)
            len=len1;
        else
            len=len2;
        int i;
        char[] ca=a.toCharArray();
        char[] cb=b.toCharArray();
        String r=new String();
        Boolean flag=false;
        for(i=len-1;i>=0;i--)
        {
            if(ca[i]=='1'&&cb[i]=='1')
            {
                if(flag==true)
                    r=r+"1";
                else
                    r=r+"0";
                flag=true;
            }
            if(ca[i]=='1'&&cb[i]=='0')
            {
                if(flag==true)
                {
                    r=r+"0";
                    flag=true;
                }
                else
                {
                    r=r+"1";
                    flag=false;

                }
            }
            if(ca[i]=='0'&&cb[i]=='1')
            {
                if(flag==true)
                {
                    r=r+"0";
                    flag=true;
                }
                else
                {
                    r=r+"1";
                    flag=false;

                }
            }
            if(ca[i]=='0'&&cb[i]=='0')
            {
                if(flag==true)
                {
                    r=r+"1";
                }
                else
                {
                    r=r+"0";
                }
                flag=false;
            }

        }
        if(len1>len2)
        {
            for(i=len1-len-1;i>=0;i--)
            {
                if(ca[i]=='0'&&flag==true)
                {
                    r=r+"1";
                    flag=false;
                }
                if(ca[i]=='0'&&flag==false)
                {
                    r=r+"0";
                    flag=false;
                }
                if(ca[i]=='1'&&flag==true)
                {
                    r=r+"0";
                    flag=true;
                }
                if(ca[i]=='1'&&flag==false)
                {
                    r=r+"1";
                    flag=false;
                }
            }
        }
        else
        {
            for(i=len2-len-1;i>=0;i--)
            {
                if(cb[i]=='0'&&flag==true)
                {
                    r=r+"1";
                    flag=false;
                }
                if(cb[i]=='0'&&flag==false)
                {
                    r=r+"0";
                    flag=false;
                }
                if(cb[i]=='1'&&flag==true)
                {
                    r=r+"0";
                    flag=true;
                }
                if(cb[i]=='1'&&flag==false)
                {
                    r=r+"1";
                    flag=false;
                }
            }
        }
        if(flag==true)
            r=r+"1";
        String s=reverse(r);
        return s;

    }
    public static void main(String[] args)
    {
        //System.out.println(addBinary("11","1"));
        System.out.println(addBinary("1111","1000"));
    }
}

 leetcode总能在我不经意的时候给我使绊子。

原文地址:https://www.cnblogs.com/zhenzhenhuang/p/7126935.html