LeetCode刷题记录(三十三): 字符串相加

134 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情

字符串相加

image.png

题目解析

题目难度:简单

题目素材解析

根据题目的描述来看,一共提供了三个参数素材:

  1. 字符串num1

  2. 字符串num2

注意:字符串num1、num2的长度在1到10000之间,而且这两个字符串开头不会为0。

我的解读

我对这道题目的解读,主要是放在了取字符串中每一位的值、相加进位处理这两点上。

因为这里面主要就是这两点比较费劲。

取字符串的值,目前主流的使用方法就是charAt方法,当然你也可以用substring,但是这个方法明显就耗费性能比较大。

相加进位,就是典型的数学知识了,需要一个中间位数来存储是否进位的标识。

解题思路

还是围绕上面的两点来解决问题。

第一步,先创建一个StringBuilder对象。

第二步,获取两个字符串的最大下标索引。

第三步,开始循环,循环体内判断两个下标索引是否符合要求。

第四步,相加后判断是否进位,将结果值存入StringBuilder对象中。

第五步,结束循环,判断最后一次计算是否存在进位。

第六步,利用StringBuilder的反转方法获得结果值。

代码

执行代码如下:

public class Test {

    public static void main(String[] args) {
        Test test = new Test();
        System.out.println(test.addStrings("11","123"));
        System.out.println(test.addStrings("456","77"));
        System.out.println(test.addStrings("1","9"));
    }

    public String addStrings(String num1, String num2) {
        StringBuilder result = new StringBuilder();
        int n1l = num1.length() - 1;
        int n2l = num2.length() - 1;
        int z = 0;
        while(n1l >= 0 || n2l >= 0){
            int n1 = 0, n2 = 0;
            if(n1l >= 0){
                n1 = num1.charAt(n1l) - 48;
            }
            if(n2l >= 0){
                n2 = num2.charAt(n2l) - 48;
            }
            if(n1 + n2 + z >= 10){
                int r = n1 + n2 + z - 10;
                result.append(r);
                z = 1;
            }else{
                int r = n1 + n2 + z;
                result.append(r);
                z = 0;
            }
            n1l--;
            n2l--;
        }
        if(z != 0){
            result.append(z);
        }
        return result.reverse().toString();
    }

}

执行结果

执行结果一般,推测是因为使用了StringBuilder的reverse方法导致的。

感觉这个反转方法性能耗费很大。

大家有兴趣可以自己试一下。

image.png