【LeetCode】字符串相加Java题解

33 阅读2分钟

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

题目描述

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

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

示例 1:

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

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

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

链接:https://leetcode.cn/problems/add-strings/

思路分析

  • 今天的算法题目是字符串类型题目。题目要求计算我们 num1 和 num2 的加法,要求不能直接调用库函数,也不能直接将输入的字符串转换为整数形式。分析一下,我们平时计算加法,一般考虑两点,一是进位,一是溢出。这个题目用字符串计算,不用考虑溢出的问题。
  • 为了计算方便,我们首先将 num1, num2 合并成相同的长度,当长度不够的时候,可以直接补0。当 num1, num2 长度相同之后,我们直接逐位计算,从低位到高位。计算的时候如果使用 num1.charAt(i) 注意需要转换成十进制的数值。那如何转换呢?num1.charAt(i)默认获取的是字符的ASCII码。ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符。其中32~126(共95个)是字符(32是空格),其中48~57为0到9十个阿拉伯数字。我们转换的时候,可以直接使用 num1.charAt(i) - '0',转换成十进制的数字。
  • 十进制的数字计算需要考虑进位的,和我们计算加法是一样的,只需要转换成的字符串的形式即可。在频繁修改字符串的时候,我们一般使用StringBuilder。 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。可以节省空间,提升计算效率。具体实现代码如下,供参考。

通过代码

class Solution {
    public String addStrings(String num1, String num2) {
        int n = Math.max(num1.length(), num2.length());

        num1 = help(n, num1);
        num2 = help(n, num2);

        StringBuilder ans = new StringBuilder();

        int cnt = 0;
        for (int i = n - 1; i >= 0; i--) {
            int t = num1.charAt(i) - '0' + num2.charAt(i) - '0';
            if (cnt > 0) {
                t += cnt;
                cnt--;
            }
            if (t > 9) {
                cnt++;
                t -= 10;
            }
            ans.append(t);
        }
        if (cnt > 0) {
            ans.append(cnt);
        }

        return ans.reverse().toString();
    }

    private String help(int n, String s) {
        if (s.length() < n) {
            StringBuilder temp = new StringBuilder();
            for (int j = 0; j < n - s.length(); j++) {
                temp.append("0");
            }
            temp.append(s);
            s = temp.toString();
        }

        return s;
    }
}

总结

  • 这个题目思路比较容易想到,考察的是边界处理和基础的编码能力。上述算法的时间复杂度是O(n),空间复杂度是O(n)
  • 坚持算法每日一题,加油!我会继续更新,也欢迎算法爱好者一起交流学习。