思路一
- 将从右到左的加法,变成从左到右的加法;
- 顺序遍历字符串。
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 计算两个数之和
* @param s string字符串 表示第一个整数
* @param t string字符串 表示第二个整数
* @return string字符串
*/
public String solve (String s, String t) {
// write code here
if(s.length() == 0) return t;
if(t.length() == 0) return s;
StringBuilder res = new StringBuilder();
StringBuilder s1 = new StringBuilder(s);
StringBuilder s2 = new StringBuilder(t);
// 逆转原字符串
s1 = s1.reverse();
s2 = s2.reverse();
// 从左到右加法
res = addInStr(s1, s2);
// 反转,从右到左加法
return res.reverse().toString();
}
private StringBuilder addInStr(StringBuilder s1, StringBuilder s2){
int idx1 = 0, idx2 = 0;
int len1 = s1.length(), len2 = s2.length();
int carry = 0; // 进位
StringBuilder res = new StringBuilder();
while(idx1 < len1 || idx2 < len2 || carry > 0){
int val = carry; // 先加进位
if(idx1 < len1){ // 字符串s1
// val += Integer.parseInt(s1.charAt(idx1++));
val += s1.charAt(idx1++) - '0';
}
if(idx2 < len2){ // 字符串s2
// val += Integer.parseInt(s2.charAt(idx2++));
val += s2.charAt(idx2++) - '0';
}
carry = val / 10; // 取整得进位
val = val % 10; // 求余得当前位置和
// System.out.println("val=" + val + ", carry=" + carry);
res.append(val);
}
return res;
}
}
思路二
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 计算两个数之和
* @param s string字符串 表示第一个整数
* @param t string字符串 表示第二个整数
* @return string字符串
*/
public String solve (String s, String t) {
// write code here
if(s.length() == 0) return t;
if(t.length() == 0) return s;
StringBuilder res = new StringBuilder();
int idx1 = s.length() - 1;
int idx2 = t.length() - 1;
int carry = 0;
while(idx1 >= 0 || idx2 >= 0 || carry > 0){
int val = carry;
if(idx1 >= 0){
val += s.charAt(idx1--) - '0';
}
if(idx2 >= 0){
val += t.charAt(idx2--) - '0';
}
// res.append(val % 10); // 在尾部插入
res.insert(0, val % 10); // 在首部插入
carry = val / 10;
}
// return res.reverse().toString();
return res.toString();
}
}