Leetcode题解(4):字符串相加

LeetCode415

        题目挺简单的,也没有什么难点和要注意的点,正常写就行了。

public class Solution {
    public String addStrings(String num1, String num2) {
        int n1 = num1.length() - 1, n2 = num2.length() - 1, carry = 0;
        StringBuilder sb = new StringBuilder();
        while (n1 >= 0 || n2 >= 0 || carry != 0) {
            int a = n1 >= 0 ? num1.charAt(n1) - '0' : 0;
            int b = n2 >= 0 ? num2.charAt(n2) - '0' : 0;
            int sum = a + b+ carry;
            carry = sum / 10;
            sb.append((char) (sum % 10 + '0'));
            n1--;
            n2--;
        }
        return sb.reverse().toString();
    }
}

        当然只有上面一道题是没有什么可讲的,重要的是上面的题的扩展,实现 $36$ 进制的加法:

36进制由0-9, a-z, 共36个字符标识。
要求按照加法规则计算出任意两个36进制正整数的和,如1b + 2x = 48 (47 + 105 = 152)
要求:不允许将36进制转为10进制,再将结果转回36进制的做法

        其实基本思路也跟上面的题相似,先求出和,再取余,只不过这次取余的模是 $36$ 。而且由于不是 $10$ 进制,因此字符和整型之间转换的步骤也要重写一下,实现如下:

public class Solution {
    public String addString(String num1, String num2) {
        int n1 = num1.length() - 1, n2 = num2.length() - 1, carry = 0;
        StringBuilder sb = new StringBuilder();
        while (n1 >= 0 || n2 >= 0 || carry != 0) {
            int a = n1 >= 0 ? getInt(num1.charAt(n1)) : 0;
            int b = n2 >= 0 ? getInt(num2.charAt(n2)) : 0;
            int sum = a + b + carry;
            carry = sum / 36;
            sb.append(getChar(sum % 36));
            n1--;
            n2--;
        }
        return sb.reverse().toString();
    }

    private int getInt(char c) {
        if (Character.isDigit(c)) return c - '0';
        else return c - 'a' + 10;
    }

    private char getChar(int i) {
        if (i < 10) return (char) (i + '0');
        else return (char) (i + 'a' - 10);
    }
}