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’,生成结果字符串的时候再转回来,可能还会简单点,不试了

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