题目描述
以字符串的形式读入两个数字,编写一个函数计算它们的和,以字符串形式返回。字符串长度不大于100000,保证字符串仅由’0’~'9’这10种字符组成
解题思路:
总的思路:
将字符串变成字符数组,然后两数组元素从后至前进行相加运算,结果存入栈中,将栈变成数组,然后将数组变成字符串,得出结果
思路细化:
- 考虑到是从后往前进行运算的,所以使用栈进行结果的存储(先进后出)
- 将字符串变成字符数组
- 看代码
代码
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 计算两个数之和
* @param s string字符串 表示第一个整数
* @param t string字符串 表示第二个整数
* @return string字符串
*/
public String solve (String s, String t) {
if(s.length()==0){
return t;
}
if(t.length() == 0){
return s;
}
// write code here
//用来控制相加次数
int slen = s.length()-1;
int tlen = t.length()-1;
//将字符串变成字符数组
String[] str = s.split("");
String[] ttr = t.split("");
//用来存储加上了的数字
Stack<Integer> stack = new Stack<Integer>();
int flag2 = 0;//用来存放十位数
while((slen>=0) && (tlen>=0)){
//将字符数组中的字符变成数字
int stemp = Integer.parseInt(str[slen]);
int ttemp = Integer.parseInt(ttr[tlen]);
//将数字一个个相加
int temp = stemp + ttemp;
//如果flag2不等于0,也就是上一次运算相加>9,那就要进一位
if(flag2 != 0){
temp = temp+flag2;
flag2 = 0;
}
//如果加起来大于9就要进位,所以只加个位
if(temp > 9){
int flag1 = temp%10;//个位数
stack.push(flag1);//将个位数放进栈
flag2 = temp/10;//十位数,下一次运算加上(也就是前面一位数相加的时候再加上)
}else{
//如果加起来不大于9,就直接放进栈
stack.push(temp);
}
//相加次数减一
slen--;
tlen--;
}
//如果s字符串还没有加完
while(slen>=0){
int temp = Integer.parseInt(str[slen]) + flag2;//一定要加上flag2,因为t字符串运算完了之后,可能flag2不等于0,也就是要进一位(9+8)
if(flag2 !=0){
flag2 = 0;
}
if(temp > 9){
int flag1 = temp%10;//个位数
stack.push(flag1);
flag2 = temp/10;//十位数
}else{
stack.push(temp);
}
slen--;
}
//如果t字符串还没有加完
while(tlen>=0){
int temp = Integer.parseInt(ttr[tlen]) + flag2;//一定要加上flag2,因为s字符串运算完了之后,可能flag2不等于0,也就是要进一位(9+8)
if(flag2 !=0){
flag2 = 0;
}
if(temp > 9){
int flag1 = temp%10;//个位数
stack.push(flag1);
flag2 = temp/10;//十位数
}else{
stack.push(temp);
}
tlen--;
}
if(flag2 != 0){//这里也不能忘记flag2(99+1)
stack.push(flag2);
}
//将栈变成字符数组,然后面呈字符串
int []all = new int[stack.size()];
int len = stack.size();
String s1="";
StringBuffer sb = new StringBuffer(s1);
for(int j=0; j<len;j++){
all[j] = stack.pop();
sb.append(all[j]);
}
String s2=sb.toString();
return s2;
}
}