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"));
    }
}
时间: 2024-10-12 05:29:40

leetcode Add Binary (easy) /java的相关文章

LeetCode——Add Binary

Given two binary strings, return their sum (also a binary string). For example, a = "11" b = "1" Return "100". 求数字字符串的二进制和.同之前的数组代表数字,两个数组相加一样,只不过进位变成了2.可能两个串的长度不一样,故逆转,从左到右加下去,最后再逆转. public static String addBinary(String a,

[leetcode]Add Binary @ Python

原题地址:https://oj.leetcode.com/problems/add-binary/ 题意: Given two binary strings, return their sum (also a binary string). For example,a = "11"b = "1"Return "100". 解题思路:提供两种实现方式吧. 代码一: class Solution: # @param a, a string # @pa

[LeetCode] [Add Binary 2012-04-02 ]

Given two binary strings, return their sum (also a binary string). For example, a = "11" b = "1" Return "100". string 的操作,短string补位.两个"0"会输出一个"00",要特殊处理,plus如果最后为"1",要补上. ? 1 2 3 4 5 6 7 8 9 10 1

LeetCode: Add Binary 解题报告

Add BinaryGiven two binary strings, return their sum (also a binary string). For example,a = "11"b = "1"Return "100". SOLUTION: 指针指到两个字符串的末尾,不断往前推进,用carry表示进位.用stringbuilder来记录结果. 使用insert(0, c)函数将加出的结果不断插入到STRINGBUILDER. 1 p

LeetCode Add Binary 结题报告

https://oj.leetcode.com/problems/add-binary/ Given two binary strings, return their sum (also a binary string). For example, a = "11" b = "1" Return "100". 解题报告:二进制加法,分类为:Easy.没有任何算法,就是按照普通的方法计算即可. 一开始写了一个高低位reverse的,然后再从0到高位

67. Add Binary [easy] (Python)

题目链接 https://leetcode.com/problems/add-binary/ 题目原文 Given two binary strings, return their sum (also a binary string). For example, a = "11" b = "1" Return "100". 题目翻译 给定两个二进制字符串,返回它们的和(也是二进制字符串). 比如:a = "11",b = &q

leetcode valid parentheses(easy) /java

题目如图 首先明确的是,可以有(()) ([])诸如此类的表达的. 然后用栈实现算法是,较为容易的. 判断总长度,不是2的倍数,返回false. 如果第一个是)]},返回false. 如果是( [  {则压入栈中 如果是)则看栈顶是不是(,如果不是,那么返回false.其他,类似. 执行完循环,如果栈为空,返回true.栈不为空,返回false. 用linkedlist实现栈. 构造函数,举例: LinkedList link=new LinkedList(); LinkedList<Strin

LeetCode Add Binary

Given two binary strings, return their sum (also a binary string). For example, a = "11" b = "1" Return "100". 题意:二进制的加法. 思路:跟大数加法差点儿相同. class Solution { public: string addBinary(string a, string b) { stack<int> s; int

leetcode Implement strStr()(easy) /java

我以为,当时我用c++写这个函数的时候,整个人如同乱麻. 这次用java写.先查的SE 8中String的方法.找到两个与此函数有关的方法:matches()和substring(). import java.io.*; import java.util.*; public class Solution { public static int strStr(String haystack, String needle) { int r=-1; int len1=haystack.length()