Leetcode:NO.67 二進制求和

題目

給你兩個二進制字符串,返回它們的和(用二進制表示)。

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

示例 1:

輸入: a = "11", b = "1"
輸出: "100"
示例 2:

輸入: a = "1010", b = "1011"
輸出: "10101"
提示:

每個字符串僅由字符 '0''1' 組成。
1 <= a.length, b.length <= 10^4
字符串如果不是 "0" ,就都不含前導零。

解題思路

  • 將兩個數根據最長的那個數的長度轉化爲char[]
  • 從後向前遍歷,通過識別兩個數該位數以及進位變量中1的個數來確定改值以及下一個進位值
  • 通過最後一個進位符加上char list 爲返回值
/**
 * @author ffzs
 * @describe
 * @date 2020/6/23
 */
public class Solution {
    public static String addBinary(String a, String b) {
        char[] aChar, bChar;
        int len = Math.max(a.length(), b.length());
        if (a.length() > b.length()) {
            aChar = a.toCharArray();
            bChar = charList(b, a.length() - b.length(), len);
        }
        else if (a.length() == b.length()) {
            aChar = a.toCharArray();
            bChar = b.toCharArray();
        }
        else{
            bChar = b.toCharArray();
            aChar = charList(a, b.length() - a.length(), len);
        }

        char[] res = new char[len];
        int next = 0;
        for (int i = len-1; i >= 0; --i) {
            int sum = aChar[i] + bChar[i] + next - 2 * '0';
            res[i] = (char)(sum % 2 + '0');
            next = sum / 2;
        }
        StringBuilder sb = new StringBuilder();
        if (next == 1) sb.append('1');
        sb.append(res);
        return sb.toString();
    }

    private static char[] charList (String s, int start, int len) {
        char[] seq = new char[len];
        for (int i = 0; i < len; i++) {
            if (i < start) seq[i] = '0';
            else seq[i] = s.charAt(i-start);
        }
        return seq;
    }

    public static void main(String[] args) {
        String a = "1010", b = "1011";
        System.out.println(addBinary(a, b));
    }
}

在這裏插入圖片描述

優化

  • ab都通過自己編寫的方法進行轉化,減少代碼量
/**
 * @author ffzs
 * @describe
 * @date 2020/6/23
 */
public class Solution {
    public static String addBinary(String a, String b) {
        
        int len = Math.max(a.length(), b.length());
        char[] aChar = charList(a, len - a.length(), len);
        char[] bChar = charList(b, len - b.length(), len);
        

        char[] res = new char[len];
        int next = 0;
        for (int i = len-1; i >= 0; --i) {
            int sum = aChar[i] + bChar[i] + next - 2 * '0';
            res[i] = (char)(sum % 2 + '0');
            next = sum / 2;
        }
        StringBuilder sb = new StringBuilder();
        if (next == 1) sb.append('1');
        sb.append(res);
        return sb.toString();
    }

    private static char[] charList (String s, int start, int len) {
        char[] seq = new char[len];
        for (int i = 0; i < len; i++) {
            if (i < start) seq[i] = '0';
            else seq[i] = s.charAt(i-start);
        }
        return seq;
    }

    public static void main(String[] args) {
        String a = "1010", b = "1011";
        System.out.println(addBinary(a, b));
    }
}

在這裏插入圖片描述

還可以直接將a,b轉成int[],0代表’0’, 1代表’1’,生成結果字符串的時候再轉回來,可能還會簡單點,不試了

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