【Garen刷题笔记】LeetCode 67 二进制求和

LeetCode 67 二进制求和(6.23每日一题)

题目:给你两个二进制字符串,返回它们的和(用二进制表示)。输入为 非空 字符串且只包含数字 1 和 0。

Given two binary strings, return their sum (also a binary string).
The input strings are both non-empty and contains only characters 1 or 0.
示例:
输入:a = “11”,b = “1”
输出:"100"

解法1
最简单的解法是将二进制数转化为十进制数,相加之后再转化为二进制数,但这种方法对输入的值有限制。除此之外,参考十进制运算的“逢十进一”,只是二进制位“逢二进一”。可以维护一个栈来存储每一位的结果,最后弹出即为二进制加法运算结果,或者直接翻转字符串。

代码:

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

分析:
时间复杂度:O(N)
空间复杂度:O(1)

    public String addBinary(String a, String b) {
    //栈
        Stack<Integer> stack = new Stack<>();
        StringBuilder sb = new StringBuilder();
        int i = a.length() - 1, j = b.length() - 1, carry = 0;
        while (i >= 0 || j >= 0 || carry != 0) {
            carry += i >= 0 ? a.charAt(i--) - '0' : 0;
            carry += j >= 0 ? b.charAt(j--) - '0' : 0;
            stack.push(carry % 2);
            carry = carry / 2;
        }
        while (!stack.isEmpty())
            sb.append(stack.pop());
        return sb.toString();
    }

分析:
时间复杂度:O(N)
空间复杂度:O(N)

你可能感兴趣的:(LeetCode刷题笔记)