leecode第四十三题(字符串相乘)
class Solution { public: string multiply(string num1, string num2) { string zero = "0";//特殊情况 if (num1[0] == '0' || num2[0] == '0') return zero; int len1 = num1.size(); int len2 = num2.size(); char **str = new char*[len2];//建立一个二维的len2*(len1+len2+1)的数组,这里的建立和赋值是教学局了,学习 for (int i = 0; i < len2; i++) { str[i] = new char[len1 + len2 + 1]; memset(str[i], '0', len1 + len2);//初始化赋值 str[i][len1 + len2] = '\0';//实际用到的只有len1+len2的长度,但是多出一位赋值‘\0’ } for (int i = len2 - 1; i >= 0; i--)//这个双重循环目的是用len2里每个值乘len1整体,并保存在二维数组行中 { for (int j = len1 - 1; j >= 0; j--)//至于实现,就是模拟乘法中的每一位相乘,从后向前 { int ans = (num1[j] - '0')*(num2[i] - '0'); str[i][i + j + 1] += ans % 10;//注意这里索引位置,要考虑非个位数值乘法,后面是要补零的 str[i][i + j] += ans / 10; if (str[i][i + j + 1] > '9') { str[i][i + j] += 1; str[i][i + j + 1] = str[i][i + j + 1] - '9' + '0' - 1;//这里之前忘了-1 } } } for (int i = 0; i < len2 - 1; i++)//这里的双重循环目的是将之前保存的,每个位置的乘法结果相加,还是两两相加,所以返回是最后一行 { for (int j = len1 + len2 - 1; j >= 0; j--) { str[i + 1][j] += (str[i][j] - '0'); if (str[i + 1][j] > '9') { str[i + 1][j - 1] += 1; str[i + 1][j] = str[i + 1][j] - '9' + '0' - 1; } } } int i = 0; while (str[len2 - 1][i] == '0')//把最后一层开头的0都去掉 { for (int j = 0; j < len1 + len2; j++) str[len2 - 1][i + j] = str[len2 - 1][i + j + 1]; } return str[len2 - 1]; } };
分析:
这题我写了半天,不是思想有问题,主要部分第一时间就写好了,就卡在二维数组建立上了,不知道为啥string不方便,只好改用char,用了char初始化还不让我循环初始化,只好用memset,下面的就是忘了对超出'9'的复位后-1,其他就没啥了,感觉这个题思想很简单,考的是编程能力。