转自牛客网
:https://www.nowcoder.com/practice/11ae12e8c6fe48f883cad618c2e81475?tpId=196&tqId=37176&rp=1&ru=/exam/oj&qru=/exam/oj&sourceUrl=%2Fexam%2Foj%3Fpage%3D1%26tab%3D%25E7%25AE%2597%25E6%25B3%2595%25E7%25AF%2587%26topicId%3D196&difficulty=undefined&judgeStatus=undefined&tags=&title=
描述
以字符串的形式读入两个数字,编写一个函数计算它们的和,以字符串形式返回。
数据范围:s.length,t.length≤100000s.length,t.length \le 100000s.length,t.length≤100000,字符串仅由’0’~‘9’构成
要求:时间复杂度 O(n)O(n)O(n)
public String solve(String s, String t) {
//如果有一方为空字符串,直接返回另外一个字符串
if (s.length()<= 0) {
return t;
}
if (t.length() <=0) {
return s;
}
//交换字符串 ,使得s为较为长的字符串
if(s.length()<t.length()){
String temp = s;
s = t;
t = temp;
}
//增加变量存储进位
int carry = 0;
//用来装两个字符串的结果
char[] newNum = new char[s.length()];
//从低位依次向高位获取 低位数字从str.leng-1开始
for (int i = s.length() - 1; i >= 0; i--) {
//低位先加,加上进位的数。
//这里的-'0'是将 ascii 相减。获得的值正好是 对应的数字
int temp = s.charAt(i) - '0' + carry;
//画图可以发现,获取到的是从较短的最后一位,逐渐往前推移的数字下标
int shortStringIndex = i - s.length() + t.length();
if(shortStringIndex>=0){
temp = t.charAt(shortStringIndex) - '0' +temp;
}
//除法获取进位
carry = temp /10;
//取余获得个位
temp = temp % 10;
// 从后往前添加字符
newNum[i] = (char)(temp +'0');
}
String output = String.valueOf(newNum);
// 如果i>=0不符合条件,上一轮的carry(进位)又是 1的话,这里需要额外处理
if(carry==1){
output = '1' +output;
}
return output;
}
收获:
1.char -》int 转换 == char - ‘0’
2.从加法的原理来考虑 —》 从原理考虑问题