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;
    }
}

结果

LeetCode——415.字符串相加_第1张图片
太慢了,虽然这个是一种解法,但是这样子,这个算法就太菜了。

改进思路

因为现在的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();


    }
}

结果

LeetCode——415.字符串相加_第2张图片
速度提升了不少,应该这种算是比较快的了。

你可能感兴趣的:(LeetCode)