[LeetCode From Day One] - Addition and Subtraction


周末刷了两个简单的加法题,66题整形数组加167题二进制数的加法。题目解法比较类似,注意点都是要考虑进位,故在此做一个简单总结。

整型数组加1

给定一个非空的整形数组,每个元素代表0-9,返回该数组加1后的结果。假设数组不包含任何前导0。
Example:
    Input: [1,2,3]
    Output: [1,2,4]

解法也很简单,从数组最后一位开始往前遍历,最后一位加1,其余每位加上上一位的进位。跳出遍历循环后如果进位仍旧为1,则返回结果多加一位。

class Solution {
    public int[] plusOne(int[] digits) {
        int carry = 0;
        if(digits[digits.length-1] + 1 == 10) {
            digits[digits.length-1] = 0;
            carry = 1;
        }
        else {
            digits[digits.length-1] += 1;
        }
        for(int i = digits.length-2; i > -1; --i) {
            if(digits[i] + carry == 10) {
                digits[i] = 0;
                carry = 1;
            }
            else {
                digits[i] += carry;
                carry = 0;
                break;
            }
        }
        if(carry == 1) {
            int[] result = new int[digits.length + 1];
            result[0] = 1;
            for(int i = 1; i < digits.length + 1; ++i) {
                result[i] = digits[i-1];
            }
            return result;
        }
        else {
            return digits;
        }
    }
}

二进制数的加法

给定两个字符串类型的二进制数,返回它们的和(二进制字符串返回)。输入字符串非空并且只包含0和1。
Example:
    Input: a=”11”, b=”1”
    Output: “100”

与上一题类似的做法,两个二进制数末尾对齐,从最后一位开始做加法,满2进位。有个小技巧,char类型的数字如何转int类型,根据ASCII码,只需要char - '0'即可。

class Solution {
    public String addBinary(String a, String b) {
        String result = "";
        int i = a.length()-1, j = b.length() - 1;
        int carry = 0;
        while(i >= 0 || j >= 0) {
            if(i >= 0) {
                carry += a.charAt(i) - '0';    
            }
            if(j>= 0) {
                carry += b.charAt(j) - '0';
            }
            result = carry % 2 + result;
            carry = carry / 2; 
            --i;
            --j;
        }
        if(carry != 0) {
            result = 1 + result;
        }
        return result;
    }
}

计算carry时,对2取模即可。同样跳出循环之后要判断carry是否为1。

  #LeetCode 

« [LeetCode From Day One] - 53. Maximum subarray [LeetCode From Day One] - Two Pointers II »