• 67. Add Binary


    题目:

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

    For example,
    a = "11"
    b = "1"
    Return "100".

    链接:  http://leetcode.com/problems/add-binary/

    题解:

    Add two binary strings,从后向前加即可,最后判断一下carry = 1的case。 这种code,算法其实不重要,还要多思考多练写得比较concise才好。要手熟。

    Time Complexity - O(n), Space Complextiy O(1)

    public class Solution {
        public String addBinary(String a, String b) {
            if(a == null || b == null)
                return "0";
            int aIndex = a.length() - 1, bIndex = b.length() - 1;
            int carry = 0, curDigit = 0;
            StringBuilder sb = new StringBuilder();
            
            while(aIndex >= 0 || bIndex >= 0) {
                int aValue = aIndex >= 0 ? a.charAt(aIndex) - '0' : 0;
                int bValue = bIndex >= 0 ? b.charAt(bIndex) - '0' : 0;
                curDigit = (aValue + bValue + carry) % 2;
                sb.insert(0, curDigit);
                carry = (aValue + bValue + carry) >= 2 ? 1 : 0;
                aIndex--;
                bIndex--;
            }
            
            if(carry == 1)
                sb.insert(0, "1");
            
            return sb.toString();
        }
    }

    二刷:

    Java:

    使用或,使用sb.insert(0, curDigit)。 

    Time Complexity - O(n2), Space Complexity - O(n)

    public class Solution {
        public String addBinary(String a, String b) {
            if (a == null || b == null) {
                return "0";
            }
            int aHi = a.length() - 1, bHi = b.length() - 1;
            StringBuilder sb = new StringBuilder();
            int carry = 0;
            while (aHi >= 0 || bHi >= 0) {
                int digitA = aHi >= 0 ? a.charAt(aHi) - '0' : 0;
                int digitB = bHi >= 0 ? b.charAt(bHi) - '0' : 0;
                sb.insert(0, (digitA + digitB + carry) % 2);
                carry = (digitA + digitB + carry) >= 2 ? 1 : 0;
                aHi--;
                bHi--;
            }
            if (carry == 1) {
                sb.insert(0, 1);
            }
            return sb.toString();
        }
    }

    这样写快一点点:

    先append, 再reverse来一遍

    public class Solution {
        public String addBinary(String a, String b) {
            if (a == null || b == null) {
                return "0";
            }
            int aHi = a.length() - 1, bHi = b.length() - 1;
            StringBuilder sb = new StringBuilder();
            int carry = 0;
            while (aHi >= 0 || bHi >= 0) {
                int digitA = aHi >= 0 ? a.charAt(aHi) - '0' : 0;
                int digitB = bHi >= 0 ? b.charAt(bHi) - '0' : 0;
                sb.append((digitA + digitB + carry) % 2);
                carry = (digitA + digitB + carry) >= 2 ? 1 : 0;
                aHi--;
                bHi--;
            }
            if (carry == 1) {
                sb.append(1);
            }
            String res = sb.toString();
            sb.setLength(0);
            for (int i = res.length() - 1; i >= 0; i--) {
                sb.append(res.charAt(i));
            }
            return sb.toString();
        }
    }

    三刷:

    Java:

    public class Solution {
        public String addBinary(String a, String b) {
            if (a == null || b == null) return "0";
            int i = a.length() - 1, j = b.length() - 1;
            StringBuilder sb = new StringBuilder();
            int carry = 0;
            while (i >= 0 || j >= 0) {
                int digitA = i >= 0 ? a.charAt(i) - '0' : 0;
                int digitB = j >= 0 ? b.charAt(j) - '0' : 0;
                sb.append((digitA + digitB + carry) % 2);
                carry = (digitA + digitB + carry) >= 2 ? 1 : 0;
                i--;
                j--;
            }
            if (carry == 1) sb.append(1);
            String res = sb.toString();
            sb.setLength(0);
            for (int k = res.length() - 1; k >= 0; k--) sb.append(res.charAt(k));
            return sb.toString();
        }
    }

    Update:

    使用一个char[] array来保存数组,最后遍历char[] array,把每一个数字放在StringBuilder里,最后返回结果。

    public class Solution {
        public String addBinary(String a, String b) {
            if (a == null || b == null) return "";
            int i = a.length() - 1, j = b.length() - 1;
            int[] digits = new int[i + j + 2];
            int k = digits.length - 1;
            int carry = 0;
            while (i >= 0 || j >= 0) {
                int digitA = (i >= 0) ? (a.charAt(i) - '0') : 0;
                int digitB = (j >= 0) ? (b.charAt(j) - '0') : 0;
                digits[k--] = (digitA + digitB + carry) % 2;
                carry =  (digitA + digitB + carry >= 2) ? 1 : 0;
                i--;
                j--;
            }
            if (carry == 1) digits[k] = 1;
            StringBuilder sb = new StringBuilder();
            for (int digit : digits) {
                if (digit == 0 && sb.length() == 0) continue;
                sb.append(digit);
            }
            if (sb.length() == 0) return "0";
            return sb.toString();
        }
    }

  • 相关阅读:
    单选框和复选框(radiobox、checkbox)
    三种alertconfirmprompt弹窗的处理方法
    iframe的切换
    python的class(类)中的object是什么意思?
    loadrunner12自带的机票预订服务,解决httpd: Could not reliably determine the server's fully qualified domain name 问题
    使用错误的用户名和密码也能运行通过
    win10删除IE某些文件导致不可用恢复的方法
    win10系统删除需要Trustedlnstaller权限的文件
    loadrunner各版本对应的ie浏览器版本
    vue之vue-router加深印象
  • 原文地址:https://www.cnblogs.com/yrbbest/p/4436429.html
Copyright © 2020-2023  润新知