一、题目描述
以字符串的形式读入两个数字,编写一个函数计算它们的和,以字符串形式返回。
数据范围:s.length,t.length≤100000,字符串仅由’0’~‘9’构成
要求:时间复杂度 O(n)O(n)
注:long的最大值:9223372036854775807
即long的最大值才19位,而t的最大长度是10万位
二、我的答案
import java.util.*;
import java.math.BigInteger;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 计算两个数之和
* @param s string字符串 表示第一个整数
* @param t string字符串 表示第二个整数
* @return string字符串
*/
public String solve (String s, String t) {
// write code here
BigInteger value1 = new BigInteger(s);
BigInteger value2 = new BigInteger(t);
return value1.add(value2).toString();
}
}
用BigInteger是投机取巧的做法,这题考察的是大数计算器的思想,只需要想象一下我们在做加法时,都做了什么事情,其实只有两种情况:需要进位和不需要进位。所谓进位,无非是当前位相加大于等于10的话,就在下一位加1。那么我们就可以用一个变量carry来表示是否有进位,有进位为1,无进位为0。
三、更好答案
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 计算两个数之和
*
* @param s string字符串 表示第一个整数
* @param t string字符串 表示第二个整数
* @return string字符串
*/
public String solve(String s, String t) {
// write code here
char[] a = s.toCharArray();
char[] b = t.toCharArray();
char[] result = new char[Math.max(a.length, b.length) + 1];
int rIndex = result.length - 1;
int aIndex = a.length - 1;
int bIndex = b.length - 1;
int carry = 0;
while (aIndex >= 0 && bIndex >= 0) {
int A = a[aIndex--] - '0';
int B = b[bIndex--] - '0';
result[rIndex--] = (char) ((A + B + carry) % 10 + '0');
carry = (A + B + carry) / 10;
}
while (aIndex >= 0) {
int A = a[aIndex--] - '0';
result[rIndex--] = (char) ((A + carry) % 10 + '0');
carry = (A + carry) / 10;
}
while (bIndex >= 0) {
int B = b[bIndex--] - '0';
result[rIndex--] = (char) ((B + carry) % 10 + '0');
carry = (B + carry) / 10;
}
if (carry != 0) {
result[rIndex] = (char) (carry + '0');
return String.valueOf(result);
}
return String.valueOf(result).substring(1);
}