43. 字符串相乘

题目

image-20240914150750515

题解

和字符串模拟加法一样,属于必背题型

代码

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
class Solution
{
public:
string multiply(string num1, string num2)
{
int m = num1.size(), n = num2.size();
// 结果最多为 m + n 位数
vector<int> res(m + n, 0);
// 从个位数开始逐位相乘
for (int i = m - 1; i >= 0; i--)
for (int j = n - 1; j >= 0; j--)
{
int mul = (num1[i] - '0') * (num2[j] - '0');

//重点在下面这个几行,是将乘法的进位信息和ij这两个位置信息结合起来,最后填入数组中适当的位置
// 乘积在 res 对应的索引位置
int p1 = i + j, p2 = i + j + 1;
// 叠加到 res 上
int sum = mul + res[p2];
res[p2] = sum % 10;
res[p1] += sum / 10;
}
// 结果前缀可能存的 0(未使用的位)
int i = 0;
while (i < res.size() && res[i] == 0)
i++;
// 将计算结果转化成字符串
string str;
for (; i < res.size(); i++)
str.push_back('0' + res[i]);

return str.size() == 0 ? "0" : str;
}
};

最后提醒一下C++中将string转换为int的自带方法 stoll ,位于 string 头文件下