给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。
注意:
num1 和num2 的长度都小于 5100.
num1 和num2 都只包含数字 0-9.
num1 和num2 都不包含任何前导零。
你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式。
把字符串的每一个字符都取出来放到栈中,再从栈中弹出该字符,相加,直到一个栈为空。然后再将没有处理的字符弹出栈中,继续相加,直至两个栈都为空。
import java.util.Stack;
class Solution {
public String addStrings(String num1, String num2) {
Stack <Integer>stack_a=new <Integer>Stack();
Stack <Integer>stack_b=new <Integer>Stack();
char tmp;
for(int i=0;i<num1.length();++i)//入栈
{
tmp=num1.charAt(i);
stack_a.push((int)tmp-48);
}
for(int i=0;i<num2.length();++i)
{
tmp=num2.charAt(i);
stack_b.push((int)tmp-48);
}
String result="";
int t=0;
while(!stack_a.isEmpty()&&!stack_b.isEmpty())//将两个栈中的数字弹出并相加,直至有一个为空
{
result+=(stack_a.peek()+stack_b.peek()+t)%10;
t=(stack_a.pop()+stack_b.pop()+t)/10;
}
while(!stack_a.isEmpty()) {
result+=(stack_a.peek()+t)%10;
t=(stack_a.pop()+t)/10;
}
while(!stack_b.isEmpty()) {
result+=(stack_b.peek()+t)%10;
t=(stack_b.pop()+t)/10;
}
if(t!=0)//可能t里面还有数值,如果t非0,得加上
result+=t;
//翻转结果字符串,因为我们把数字压入栈中,取出来相加,得到的结果是结果的翻转字符串,所以需要在最后翻转一次。
String reverse=new StringBuffer(result).reverse().toString();
return reverse;
}
}
因为现在的BigInteger 这种数据类型不能够使用了,使用栈又很慢,如果直接利用双指针,直接模拟人类的利用竖式计算加法即可。
从长度较短的字符串开始往前走,记录下两个字符的和,并记录下进位。遍历知道两个字符串都为空串即可。
class Solution {
public String addStrings(String num1, String num2) {
int length_num1=num1.length();
int length_num2=num2.length();
if (length_num1==0)
return num2;
if (length_num2==0)
return num1;
//保证字符串1的长度总是大于等于字符串2的长度
if (length_num2>length_num1)
{
String temp=num1;
num1=num2;
num2=temp;
int a=length_num1;
length_num1=length_num2;
length_num2=a;
}
int temp1=0;
int temp2=0;
int carry=0;//记录进位
int differ=length_num1-length_num2;
StringBuffer result=new StringBuffer();
for (int i=length_num2-1;i>=0;--i)//从后开始往前遍历
{
temp1=num1.charAt(i+differ)-48;
temp2=num2.charAt(i)-48;
result.append((temp1+temp2+carry)%10);
carry=(temp1+temp2+carry)/10;
}
for (int i=differ-1;i>=0;--i)
{
temp1=num1.charAt(i)-48;
result.append((temp1+carry)%10);
carry=(temp1+carry)/10;
}
//最终还可能产生进位,如果有,要加上去
if (carry!=0)
result.append(carry);
return result.reverse().toString();
}
}