1. 程式人生 > >LeetCode-二進位制求和

LeetCode-二進位制求和

LeetCode-二進位制求和

Table of Contents

1 Easy-二進位制求和

1.1 題目描述

給定兩個二進位制字串,返回他們的和(用二進位制表示)。

輸入為非空字串且只包含數字 1 和 0。

1.2 示例 1:

輸入: a = "11", b = "1"

輸出: "100"

1.3 示例 2:

輸入: a = "1010", b = "1011"

輸出: "10101"

2 自己的解答

2.1 思路

  1. 使用a和b中較長者作為迴圈終止條件,遍歷a和b字串.逆序遍歷,比較符合普通人理解的二進位制求和方法.
  2. 定義一個變數up,表示是否有進位,'1'為有進位,'0'為沒有進位.
  3. 將a和b當前位置的字元加上進位符up,再減去兩個'0'字元,即得到當前位的和c.
    • 如果當前位的和c大於'2',說明有進位,將up更新為'1'.並將c減去'2'之後插入到StringBuilder變數的首端.
    • 如果當前位置的和c小於'2',說明沒有進位,將up更新為'0',並將c插入到StringBuilder變數的首端.
  4. 當a和b其中一方已經遍歷完後,未遍歷完的一方放入StringBuilder變數的首端,同時要判斷是否由進位.
  5. 在迴圈結束之後,如果進位符沒有被恢復為'0',說明最後有進位,需要在StringBuilder變數首端插入'1'.

2.2 反思

  1. 思路是正確的,但是實現起來太過複雜.
  2. 以後遇到此種情況可以轉換思路,如果操作String不方便,可以將String變為int,來計算二進位制的和.
    • 例如:用int變數sum記錄a和b對應位置字元的和,然後sum%2就是當前位置字元的int形式,並將其新增到StringBuilder中.是否有進位可以通過sum/2判斷,並可以將carry作為下一次sum的初始值.

2.3 程式碼

2.3.1 自己的程式碼

package algorithm.easy;

public class AddBinary {
    public static String solution(String a, String b) {
        StringBuilder sb = new StringBuilder();
        int alen = a.length();
        int blen = b.length();
        int N = alen > blen ? alen : blen;
        char up = '0';
        char c = ' ';
        for (int i = 1; i <= N; i++) {
            int ai = a.length() - i;
            int bi = b.length() - i;
            if (ai < 0) {
                // b比a長
                // 有上一位的進位
                if (up == '1') {
                    c = (char) (b.charAt(bi) + up - '0');
                    if (c < '2') {
                        sb.insert(0, c);
                        // 恢復上一位進位
                        if (up != '0') {
                            up = '0';
                        }
                    } else {
                        if (up != '1') {
                            // 有進位
                            up = '1';
                        }
                        sb.insert(0, '0');
                    }
                    continue;
                } else {
                    // 沒進位,直接把剩餘的字串插入即可
                    sb.insert(0, b.substring(0, bi + 1));
                    break;
                }
            }
            if (bi < 0) {
                // a比b長
                // 有上一位的進位
                if (up == '1') {
                    c = (char) (a.charAt(ai) + up - '0');
                    if (c < '2') {
                        sb.insert(0, c);
                        // 恢復上一位進位
                        if (up != '0') {
                            up = '0';
                        }
                    } else {
                        if (up != '1') {
                            // 有進位
                            up = '1';
                        }
                        sb.insert(0, '0');
                    }
                    continue;
                } else {
                    // 沒進位,直接把剩餘的字串插入即可
                    sb.insert(0, a.substring(0, ai + 1));
                    break;
                }
            }
            c = (char) (a.charAt(ai) + b.charAt(bi) + up - '0' - '0');
            if (c < '2') {
                // 插入到sb中
                sb.insert(0, c);
                // 恢復上一位進位
                if (up != '0') {
                    up = '0';
                }
            } else {
                if (up != '1') {
                    // 有進位
                    up = '1';
                }
                c = (char) (c - '2' + '0');
                // 插入到sb中
                sb.insert(0, c);
            }
        }
        // 到最後還有進位,則插入1一個1,否則不插入
        if (up == '1') {
            sb.insert(0, '1');
        }

        return sb.toString();
    }

    public static void main(String[] args) {
        System.out.println(solution("1010","1011"));
        System.out.println(solution("11","1"));
        System.out.println(solution("110","110010"));
        System.out.println(solution("101111","10"));
        System.out.println(solution("0", "0"));
        System.out.println(solution("100", "110010"));
    }
}

2.3.2 別人的程式碼

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

Date: 2018-11-06 21:00

Author: devinkin

Created: 2018-11-06 二 21:00

Validate