Leetcode题解(4):字符串相加
题目挺简单的,也没有什么难点和要注意的点,正常写就行了。
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);
}
}