• 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总能在我不经意的时候给我使绊子。

  • 相关阅读:
    第一次
    ActiveReports 报表控件V12新特性 -- 文本框和标签控件的浓缩
    ActiveReports 报表控件V12新特性 -- 新增JSON和CSV导出
    ActiveReports 报表控件V12新特性 -- 可定制的安装设置
    葡萄城报表模板库再次更新!补充医院Dashboard及房地产销售行业报表
    ActiveReports 报表控件V12新特性 -- 页面报表新增子报表
    ActiveReports 报表控件V12新特性 -- 无需ETL处理,即可实现跨数据源分析数据
    使用多级分组报表展现分类数据
    如何将水晶报表(Crystal Report)导入葡萄城报表
    使用葡萄城报表,轻松实现高度精准的报表套打
  • 原文地址:https://www.cnblogs.com/zhenzhenhuang/p/7126935.html
Copyright © 2020-2023  润新知