LeetCode-415-字符串相加

本文介绍了两种在不使用内置库或整数转换的情况下,解决LeetCode字符串相加问题的方法。第一种方法通过三次字符串反转实现,第二种方法则优化为一次反转,并在较短字符串前补零。这两种解法均涉及字符串遍历、进位处理和字符转换。

题目

来源:LeetCode.

给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。
注:
1.num1 和num2 的长度都小于 5100
2.num1 和num2 都只包含数字 0-9
3.num1 和num2 都不包含任何前导零
4.不能使用任何內建 BigInteger 库, 
也不能直接将输入的字符串转换为整数形式

    看到这个问题我首先想到的方法就是十进制的加法。

接下来看一下解题思路:

思路一:

    1.十进制加法是从各位开始加的,所以首先需要将字符串进行反转,这里通过StringBuder类里面的resvert()方法,实现字符串的反转。
    2.每个位相加的时候可能会存在进位的情况,通过carry保存结果的十位,通过currentValue保存每一位相加的结果,包括进位;
    3.如果两个字符串长度不一样,直接将剩余的加在结果的后面即可;
    4.最后将结果反转返回;
代码示例:

class Solution {
    public String addStrings(String num1, String num2) {
        //因为后面要多次用到字符串长度,所以这里进行一次计算
        int strLen1 = num1.length();
        int strLen2 = num2.length();
        
        if(strLen1 <= 0 || num1 == null) {
            return num2;
        }
        if(strLen2 <= 0 || num2 == null) {
            return num1;
        }
        //保存进位
        int carry = 0;
        //保存相加后的当前位
        int currentValue = 0;
        //用于保存计算后的结果
        StringBuffer result = new StringBuffer();
        //反转字符串
        String string1 = String.valueOf(new StringBuffer(num1).reverse());
        String string2 = String.valueOf(new StringBuffer(num2).reverse());
        int i = 0;
        for(; i < strLen1 || i < strLen2; i++) {
            if(i >= strLen1) { //把较长的字符串直接加
                currentValue = string2.charAt(i) - '0' + carry;
            } else if(i >= strLen2) {
                currentValue = string1.charAt(i) - '0' + carry;
            } else {//因为是两个字符,所以需要减去两个'0'
                currentValue = string1.charAt(i) + string2.charAt(i) - 2 * '0' + carry;
            }
            //保存进位
            carry = currentValue / 10;
            //保存结果的个位
            currentValue %= 10;
            result.append(currentValue);
        }
        //表示最后一位也存在进位
        if(carry > 0) {
            result.append(carry);
        }
        //将结果反转
        return String.valueOf(result.reverse());
    }
}
总结

    上面用了三次字符串的反转,提交后,看了官方的解题步骤,发现人家只用了一次反转,而且代码干净整洁,果然还是自己太菜了。。。。。。。

思路二

    1.将索引定位在字符串末尾;
    2.依次从后往前遍历相加,用carry来保存进位;
    3.如果遇到字符串长度不一样的,在短的前面补0;
    4.最后将结果反转并返回;
代码示例:

class Solution {
    public String addStrings(String num1, String num2) {
        if("".equals(num1) || num1 == null) {
            return num2;
        }
        if("".equals(num2) || num2 == null) {
            return num1;
        }
        int carry = 0;
        int i = num1.length() - 1;
        int j = num2.length() - 1;
        StringBuffer result = new StringBuffer();
        while(i >= 0 || j >= 0 || carry != 0) {
            //遇到长度不够的情况下补0
            int a = (i < 0 ? 0 : num1.charAt(i--) - '0');
            int b = (j < 0 ? 0 : num2.charAt(j--) - '0');
            int add = a + b + carry;
            //保存进位信息
            carry =  add / 10;
            result.append(add % 10); 
        }
        return result.reverse().toString();
    }
}
总结

    上面通过一次遍历一次字符串反转实现两个字符串相加。
补0这个操作很巧妙,学到了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值