前言
个人网站
公众号: 北京程序猿, 网站 : https://yaml.vip
算法题
题干
给定两个字符串形式的非负整数num1和num2, 计算它们的和。
说明
- num1和num2的长度都小于5100。
- num1和num2都只包含数字0-9。
- num1和num2都不包含任何前导零。
- 你不能使用任何內建BigInteger库, 也不能直接将输入的字符串转换为整数形式。
Java代码
public String addStrings(String num1, String num2) {
final int oneLen = num1.length(), twoLen = num2.length();
int oneCursor = oneLen - 1, twoCursor = twoLen - 1;
int carry = 0;
StringBuilder data = new StringBuilder(Math.max(oneLen, twoLen) + 1);
while (oneCursor >= 0 || twoCursor >= 0) {
int val1 = oneCursor >= 0 ? num1.charAt(oneCursor--) - '0' : 0;
int val2 = twoCursor >= 0 ? num2.charAt(twoCursor--) - '0' : 0;
data.append((val1 + val2 + carry) % 10);
carry = (val1 + val2 + carry) / 10;
}
if (carry != 0) {
data.append(carry);
}
return data.reverse().toString().trim();
}
总结
- 题太简单, 提交直接通过。
- 与二进制求和太相似。
- 这种类似的题目, 可以将进制数通过参数进行传递, 不管是几进制求和, 都没问题, 代码可参考如下。
public String addStrings(String num1, String num2, int radix) {
final int oneLen = num1.length(), twoLen = num2.length();
int oneCursor = oneLen - 1, twoCursor = twoLen - 1;
int carry = 0;
StringBuilder data = new StringBuilder(Math.max(oneLen, twoLen) + 1);
while (oneCursor >= 0 || twoCursor >= 0) {
int val1 = oneCursor >= 0 ? num1.charAt(oneCursor--) - '0' : 0;
int val2 = twoCursor >= 0 ? num2.charAt(twoCursor--) - '0' : 0;
data.append((val1 + val2 + carry) % radix);
carry = (val1 + val2 + carry) / radix;
}
if (carry != 0) {
data.append(carry);
}
return data.reverse().toString().trim();
}
本文著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请于文首标明作者姓名,保持文章完整性,并附上出处和文章链接!未按规范转载者,作者保留追究相应责任的权利!
作者:北京程序猿
链接:字符串相加