因为在相加或相乘的时候,可能会出现值溢出,所以直接相加或相乘肯定是不行的, 需要另想办法。
这两道题都是模拟摆竖式进行加法与乘法, 但是有一些细节点在写的时候需要注意。
字符串相加
https://leetcode.cn/problems/add-strings
给定两个以字符串形式表示的非负整数 num1
和 num2
,返回 num1
和 num2
的乘积,它们的乘积也表示为字符串形式。
解题关键点:
- 模拟竖式相加,并且使用双指针,指针的移动方向从尾部向头部
p1--
- num1和num2的长度可能不相等,所以会出现p1或p2小于0的情况,需要单独处理
- 有可能头部元素相加的时候大于10, 所以需要在循环外单独判断进位数
- 在获取每一位的int数值时, 将其与’0’这个char相减, 省去了强转, 更加简洁
- 最后得到的结果是反的, 需要反转一下
下面是完整代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| public String add(String num1, String num2) { int p1 = num1.length() - 1; int p2 = num2.length() - 1; int add = 0; StringBuilder result = new StringBuilder(); while(p1 >= 0 || p2 >= 0){ int value1 = 0; if (p1 >= 0){ value1 = num1.charAt(p1) - '0'; } int value2 = 0; if (p2 >= 0){ value2 = num2.charAt(p2) - '0'; } result.append((value1 + value2 + add) % 10); add = (value1 + value2 + add) / 10; p1--; p2--; } if (add != 0){ result.append(add); } return result.reverse().toString(); }
|
字符串相乘
https://leetcode.cn/problems/multiply-strings/
给定两个以字符串形式表示的非负整数 num1
和 num2
,返回 num1
和 num2
的乘积,它们的乘积也表示为字符串形式。
解题关键点:
举例 num1=”123”, num2=”45”, 相乘的时候可以拆分如下:
1
| result = 123 * 5 + 123 * 40
|
在计算每一项时, 比如第二项123 * 40
时,其末尾必然为0, 且0的个数和其所处的位置有关,所以可以提前补0, 通过观察发现, 补0的个数 = (字符串长度-1) - 当前下标
。
通过补0之后, 我们就可以专心计算 123 * 4
了, 也是利用摆竖式进行相乘的思路进行相加。
当我每得到一项的值时, 利用之前的字符串相加函数, 就可以将各项的结果相加,最终获取结果值。
下面是完整代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| public String multiply(String num1, String num2) { if ("0".equals(num1) || "0".equals(num2)){ return "0"; } int l1 = num1.length() - 1; int l2 = num2.length() - 1;
String re = "0"; for (int i = l2; i >= 0; i--){ StringBuilder current = new StringBuilder(); int cycle = l2 - i; for (int j = 1; j <= cycle; j++){ current.append("0"); }
int value2 = num2.charAt(i) - '0'; int add = 0; for (int j = l1; j >= 0; j--){ int value1 = num1.charAt(j) - '0'; current.append((value1 * value2 + add) % 10); add = (value1 * value2 + add) / 10; } if (add != 0){ current.append(add); } re = add(current.reverse().toString(), re); } return re; }
|