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,其他就没啥了,感觉这个题思想很简单,考的是编程能力。

猜你喜欢

转载自www.cnblogs.com/CJT-blog/p/10591909.html