滴滴笔试算法题 两个数字字符串相加
题目释义:给定两个字符串s1、s2,字符串都是由0-9数字组成,需要将s1数字与s2数字进行相加,并返回相加后的数据结果s3。要求不能使用Integer.parseInt() BigDecimal等操作,字符长度使用Integer可能溢出。(难度:简单)
测试用例1:s1 = “123”, s2 = “234”,计算结果s3 = “357”
测试用例2:s1 = “998”, s2 = “12”,计算返回结果s3 = “1010”
代码如下,仅供学习,有更好的解法可以相互学习
public class AddStrNums {
public String addNums(String s1, String s2) {
StringBuffer result = new StringBuffer();
String ss1 = new StringBuffer(s1).reverse().toString();
String ss2 = new StringBuffer(s2).reverse().toString();
int len1 = ss1.length();
int len2 = ss2.length();
int maxLen = Math.max(len1, len2);
// 记录每一次对位数相加
int tempNum = 0;
// 标记是否有进位
int overFlow = 0;
for (int i = 0; i < maxLen; i++) {
// 下标小于s1、s2,由于charAt获取的字符是ASCII码,对应要减去0的ASCII的值
if (i < len1 && i < len2) {
tempNum = ss1.charAt(i) - '0' + ss2.charAt(i) - '0' + overFlow;
}
// 下标小于s1,但超过s2
if (i < len1 && i >= len2) {
tempNum = ss1.charAt(i) - '0' + overFlow;
}
// 下标小于s2,但超过s1
if (i >= len1 && i < len2) {
tempNum = ss2.charAt(i) - '0' + overFlow;
}
// 对位相加是否有进位
if (tempNum >= 10) {
// 进位设置为1,两个数相加最多是1
overFlow = 1;
// 记录当前位需要保存的数据
tempNum = tempNum % 10;
} else {
// 没有产生进位,进位数重置为0
overFlow = 0;
}
// 添加每次数据
result.append(tempNum);
}
// 如果相加数据长度都超过了s1、s2,则将进位数据补充在最后
if (overFlow != 0) {
result.append(overFlow);
}
// 最后对数据做翻转
return result.reverse().toString();
}
@Test
public void testAddCase() {
String s1 = "998";
String s2 = "12";
System.out.println(s1 + "+" + s2 + "=" + addNums(s1, s2));
}
}