写点什么

【LeetCode】字符串相加 Java 题解

作者:Albert
  • 2022-11-16
    北京
  • 本文字数:1289 字

    阅读完需:约 4 分钟

题目描述

给定两个字符串形式的非负整数 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)

  • 坚持算法每日一题,加油!我会继续更新,也欢迎算法爱好者一起交流学习。

发布于: 刚刚阅读数: 3
用户头像

Albert

关注

数据结构和算法爱好者 2019-09-29 加入

LeetCode,略懂后端的RD

评论

发布
暂无评论
【LeetCode】字符串相加Java题解_算法_Albert_InfoQ写作社区