算法篇——Java 大数加法(牛客网刷题)
题目描述 以字符串的形式读入两个数字,编写一个函数计算它们的和,以字符串形式返回。字符串长度不大于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; } }
下一篇:
4011基于邻接表的深度优先遍历