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


theme: smartblue

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

字符串相加

image.png

题目解析

题目难度:简单
题目素材解析

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

  1. 字符串num1

  2. 字符串num2

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

我的解读

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

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

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

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

解题思路

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

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

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

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

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

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

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

代码

执行代码如下:

```java 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ijiran

一杯咖啡太贵,一块糖就可以

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值