一:题目
二:思路
解释:每次相乘的结果不进位直接放进同一个数组里,相同位置则+=新放进的结果即可,最后得到左图的数组,再对其进行进位,得到正确的结果
Q1:数组的大小取多少?
A1:若第一个数长度为M,第二个数长度为N,则数组设置为M+N即可
两个最大的3位数,结果为6位数,所以数组最长需要M+N
Q2:对应相加的结果应该放进数组的哪一个位置? 比如1× 7 为什么的结果为什么放进了数组下标为3的位置?
A2:
可知:若第一个string的下标为i,第二个string的下标为j,则放进数组下标为[i+j+1]的位置,怎么理解呢?因为我们数组的第一个位置不能放进相乘的结果,要留来做最后一步的进位操作,所以我们i=0 和 j=0 的相乘结果就要放进数组下标为1的位置了,所以i+j+1
三:代码
class Solution {
public:std::string multiply(std::string num1, std::string num2) {if (num1.empty() || num2.empty() || num1[0] == '0' || num2[0] == '0')//一方为空字符串 或者 一方的第一个字符是0 则return "0"{return "0";}int len1 = num1.size();int len2 = num2.size();int* arr = new int[len1 + len2]();// 使用 new 分配数组并初始化为 0//循环相乘得到结果,并且将其放进数组[i+j+1]的下标位置处for(int i = len1 - 1; i >= 0; i--){//将其转换为数字int x = num1[i] - '0';for(int j = len2 - 1; j >= 0; j--){ //将其转换为数字int y = num2[j] - '0';//将相乘结果放进数组[i+j+1]的下标位置处arr[i + j + 1] += x * y;}}//对最后的数组进行进位操作for(int m = len1 + len2 - 1; m > 0; m--) {arr[m - 1] += arr[m] / 10;arr[m] %= 10;}//将数组里面的数字转换成字符且进行追加进一个新的string对象string ret;//若数组第一个位置没被用(其值为0),即代表第二个位置没有进位,所以从下标为1的位置开始进行追加int index = arr[0] == 0 ? 1 : 0;while(index < len1 + len2){ret.append(1, arr[index] + '0'); // 使用 append(1, char) 来添加单个字符index++;}delete[] arr; // 释放动态分配的数组return ret;}
};
解释:
①:一方为空字符串 或者 一方为的第一个字符是0 则return "0"
②:因为是相乘,所以两个字符串都是从后往前的进行遍历相乘得到结果
③:若数组第一个位置没被用(其值为0),即代表第二个位置没有进位,所以从下标为1的位置开始进行追加