LeetCode——415.字符串相加

题目

给定两个字符串形式的非负整数 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();


    }
}

结果

在这里插入图片描述
速度提升了不少,应该这种算是比较快的了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值