给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。

你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。

示例 1:

输入:num1 = "11", num2 = "123"
输出:"134"
示例 2:

输入:num1 = "456", num2 = "77"
输出:"533"
示例 3:

输入:num1 = "0", num2 = "0"
输出:"0"
 

提示:

1 <= num1.length, num2.length <= 104
num1 和num2 都只包含数字 0-9
num1 和num2 都不包含任何前导零

来源:力扣(LeetCode)
链接:力扣
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

package cn.fansunion.leecode.string;
/**
 * @author wen.lei
 *
 * 2022-1-13
 */
public class AddStrings {
     
    //12345->54321
    //6789-> 9876
    public String addStrings(String num1, String num2) {
        //特殊情况
        if(num1==null || num1.length()==0) {
            return num2;
        }
        if(num2==null || num2.length()==0) {
            return num1;
        }
        int num1Length=num1.length();
        int num2Length = num2.length();
        //最大长度
        int maxLength = num1Length>num2Length?num1Length:num2Length;
        //逆序
        String num3 = reverse(num1);
        String num4 = reverse(num2);
        //下一个是否有进位的1
        int nextLocationNum=0;
        StringBuilder sb = new StringBuilder();
        for(int index=0;index<maxLength;index++) {
            int oneNum=0;
            if(index <num3.length()) {
                char one=num3.charAt(index);
                oneNum=Character.getNumericValue(one);
            }
            int twoNum=0;
            if(index <num4.length()) {
                char two=num4.charAt(index);
                twoNum=Character.getNumericValue(two);
            }
            //相加求和
            int currentNumSum=oneNum+twoNum+nextLocationNum;
            //取模
            int currentNum=currentNumSum%10;
            if(currentNumSum>=10) {
                nextLocationNum=1;
            }else {
                nextLocationNum=0;
            }
            sb.append(currentNum);
        }
        //最后1个进位
        if(nextLocationNum==1) {
            sb.append(nextLocationNum);
        }
        String sum= sb.toString();
        //逆序返回
        return reverse(sum);
    }
     
    /**
     * 对一个字符串逆序
     * @param num
     * @return
     */
    private String reverse(String num) {
        StringBuilder sb = new StringBuilder();
        for(int index=num.length()-1;index>=0;index--) {
            sb.append(num.charAt(index));
        }
        return sb.toString();
    }
     
    public String addStringsByInt(String num1, String num2) {
        int num1Int=Integer.parseInt(num1);
        int num2Int=Integer.parseInt(num2);
        return (num1Int+num2Int)+"";
    }
}
package test.leecode.string;
import org.junit.Assert;
import org.junit.Test;
import cn.fansunion.leecode.string.AddStrings;
/**
 * @author wen.lei@brgroup.com
 *
 * 2022-1-13
 */
public class AddStringsTest {
    @Test
    public void test() {
        AddStrings as = new AddStrings();
        String sum1=as.addStrings("12345", "6789");
        String expected1=(12345+6789)+"";
        Assert.assertEquals(expected1, sum1);
        String sum2=as.addStrings("11", "123");
        String expected2=(11+123)+"";
        Assert.assertEquals(expected2, sum2);
        String sum3=as.addStrings("456", "77");
        String expected3=(456+77)+"";
        Assert.assertEquals(expected3, sum3);
    }
}