LeetCode-Add Binary

来源:互联网 发布:网络新媒体有哪些 编辑:程序博客网 时间:2024/06/08 10:12

Question:

Given two binary strings, return their sum (also a binary string).
For example,
a = “11”
b = “1”
Return “100”.

解题思路:转化为求二进制加法。

  • 开始想的是将字符串转换为char数组,然后用位运算先求异或^得到值放入新的数组中,求&得到进位,但是忽略了低位的进位。思路太复杂
  • 发现其实就是把十进制加法,换成二进制,遇到2就进位。

测试案例

  1. 字符串为空(a为空,b为空或都为空)
  2. 字符串长度不一致时
  3. 最高位有进位时

思考:
用java编写的,用toCharArray转换为数组时,是从字符串的第一个字符开始存放到的,而我们想要的是从字符串的最后一位开始操作,所以要将字符数组倒置。eg:String a = “1011”.转换成的字符数组从0-3开始打印是1 0 1 1.而我们进行操作需要从最右边开始,即1101。
不知道是否还有其他的方法将字符串转成倒置的数组。有待进一步思考~

public class Solution {    public String addBinary(String a, String b) {        if(a==""&&b==""){            return "";        }else if(a ==""||a.equals("0")){            return b;        }else if(b == "" || b.equals("0")) {            return a;        }else {            char[] a_arry = a.toCharArray();            char[] b_arry = b.toCharArray();            int a_len = a_arry.length;            int b_len = b_arry.length;            //将数组倒置            char[] a_arry1 = new char[a_len];            char[] b_arry1 = new char[b_len];            int k = 0;            for(int i=a_arry.length-1;i>=0;i--){                a_arry1[k] = a_arry[i];                k++;            }            int m = 0;            for(int i=b_arry.length-1;i>=0;i--){                b_arry1[m] = b_arry[i];                m++;            }            //新建字符数组存放结果            int length = Math.max(a_len, b_len)+1;            char[] new_arry = new char[length];            //谁的长度小选谁            int len = a_len>=b_len?b_len:a_len;            System.out.println("len:"+len);            int carry = 0;//进位标志            int i=0;            //对两个数组的相同位置进行求和操作            for(i=0;i<len;i++){                int sum =(a_arry1[i]-'0')+(b_arry1[i]-'0')+carry;                int temp = (sum==2?0:(sum>2?sum-2:sum));                carry = sum>=2?1:0;                //放入new_arry中                new_arry[i] = (char) ('0'+temp);            }            //把剩下的另一部分放入new_arry中            while(i<a_len){                if(carry==1){                    int temp = ((a_arry1[i]-'0')+carry)==2?0:((a_arry1[i]-'0')+carry);                    carry = ((a_arry1[i]-'0')+carry)==2?1:0;                    new_arry[i] = (char)('0'+temp);                }else {                    new_arry[i] = a_arry1[i];                }                i++;            }            while(i<b_len){                if(carry==1){                    int temp = ((b_arry1[i]-'0')+carry)==2?0:((b_arry1[i]-'0')+carry);                    carry = ((b_arry1[i]-'0')+carry)==2?1:0;                    new_arry[i] = (char)('0'+temp);                }else {                    new_arry[i] = b_arry1[i];                }                i++;            }            //判断最高位是否为进位            if(carry == 1){                new_arry[i] = (char) (carry+'0');                i++;            }            //打印结果,输出字符串。            String result = "";            for(k=i-1;k>=0;k--){                result+=new_arry[k];            }            return result;        }    }}
0 0
原创粉丝点击