LeetCode - 67. Add Binary

题目:

Given two binary strings, return their sum (also a binary string).


思路与步骤:

原思路:

将两个string逐个字符相加,设置一个flag ,进位的话记 carry=1,反之 carry=0

需要处理的一些细节:

1. a 和 b 的 0, 1 是字符形式,要写成 '0', '1';flag 是 int 型,写成 0, 1.

2. 最后一位(即最高位)加完后若 carry 为1需要给 和 的最高位设为1,即 和 的位数比a和b中较大位数还多1.

3. 如果a和b的高位有0,加完之后要把和高位上的0去掉。

改进的思路:

看了别人的代码后发现原来的思路过于繁琐,现学习别人的简洁思路:

1. 用 StringBuilder sb = new StringBuilder();

2. StringBuilder可以append 进 int 型的元素;由于二进制的含义是满 2 进 1,所以还是采用加法运算。

     如果和为2,则carry 为1,即 sum/2,sb 中加入的元素为0,即sum%2;和为1和0时情况一样。


编程遇到的问题:

1. 开始用的 char[] 型来储存和,加的时候从最低位开始,即数组下标最大处开始。结果发现由于最高位是否进1不确定,即数组的大小不确定,没有办法初始化数组,所以这个数据结构的选取失败。

2. 后来想到用 Stack ,但是最后返回是首先是无法转化成数组,然后发现输出的顺序并不是从栈顶开始(为什么,还没解决)。

3. 既然 stack 无法逆转,想到用 List ,解决了逆转的问题,即 Collections.reverse(myList); 最后遇到的问题是无法将List 转化成 String。此时我已经黔驴技穷,所以看了别人的解法,get了新的知识。


新知识学习:

StringBuilder

常用方法有:append(); length(); charAt(i); deleteCharAt(i); toString()  等。


编程实现:

我的啰嗦但很快的代码:

public class Solution {
    public String addBinary(String a, String b) {
        char[] achar = a.toCharArray();
        char[] bchar = b.toCharArray();
        int i = a.length()-1, j = b.length()-1, carry = 0;
        StringBuilder sb = new StringBuilder();
        for( ; i>=0 && j>=0; i--,j--){
            if (achar[i] != bchar[j])   sb.append(carry==0 ? '1' : '0');
            else if (achar[i]=='0' && bchar[j]=='0'){
                sb.append(carry==0 ? '0' : '1');
                carry = 0;
            } else if (achar[i]=='1' && bchar[j]=='1'){
                sb.append(carry==0 ? '0' : '1');
                carry = 1;
            }
        }
        while(i > j){
            for( ; i>=0 && carry == 0; i--)    sb.append(achar[i]);
            for( ; i>=0 && carry == 1; i--){
                sb.append(achar[i] == '0' ? '1' : '0');
                carry = (achar[i] == '0' ? 0 : 1);
            }
        }
        while(i < j){
            for( ; j>=0 && carry == 0; j--)    sb.append(bchar[j]);
            for( ; j>=0 && carry == 1; j--){
                sb.append(bchar[j] == '0' ? '1' : '0');
                carry = (bchar[j] == '0' ? 0 : 1);
            }
        }
        if(carry==1) sb.append('1');
        sb.reverse();
        while(sb.length()>1 && sb.charAt(0)=='0')  sb.deleteCharAt(0);
        return sb.toString();
    }
}

学习别人的代码:

public class Solution {
    public String addBinary(String a, String b) {
        char[] achar = a.toCharArray();
        char[] bchar = b.toCharArray();
        int i = a.length()-1, j = b.length()-1, carry = 0;
        StringBuilder sb = new StringBuilder();
        while (i >= 0 || j >= 0) {
            int sum = carry;
            if (i >= 0) sum += achar[i--]-'0';
            if (j >= 0) sum += bchar[j--]-'0';
            sb.append(sum % 2);
            carry = sum / 2;
        }
        if (carry == 1) sb.append(carry);
        return sb.reverse().toString();
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章