leetcode 43

leetcode 43_第1张图片
leetcode 43_第2张图片

class Solution {
public:
    string multiply(string num1, string num2) {
        if(num1 == "0" || num2 == "0"){
            return "0";
        }

        int m = num1.length();
        int n = num2.length();

        auto ans =vector<int>(m+n);
        for(int i = m-1;  i >= 0; i--){
            int x = num1.at(i) - '0';
            for(int j = n-1; j >= 0; j-- ){
                int y = num2.at(j) - '0';
                ans[i+j+1] += x*y;
            }
        }

        // max(i+j) = (m-1)+(n-1)+1 = n+m-1
        for(int i = m+n-1; i>0; i--){
            ans[i-1] += ans[i] / 10;
            ans[i] %= 10;
        }

        for(auto a: ans){
            cout << a << endl;
        }

        int index = ans[0] == 0? 1:0;
        string res;
        while(index < m+n){
            res.push_back(ans[index]);
            index++;
        }

        for(auto &c: res){
            c += '0';
        }
        return res;
    }
};

模拟算法

感觉这个比竖式算法好些,一般如果是9999 < 100 * 100, 所以 对于9999 < 10000, 一次类推,num1*num2 < 10^(n+m), 其中num1 是n个数组成,num2是m个数组成。
step 1:
2,2 => arr[5] +=18
2,1 => arr[4] +=15
2,0 => arr[3] +=12
1,2 => arr[4] +=12
1,1 => arr[3] +=10
1,0 => arr[2] +=8
0,2 => arr[3] += 6
0,1 => arr[2] +=5
0,0 => arr[1] +=4

step2:
arr[0] = 0
arr[1] = 4
arr[2] = 13
arr[3] = 28
arr[4] = 27
arr[5] =18

step3:
arr[0] = 0
arr[1] = 5
arr[2] = 6
arr[3] = 0
arr[4] = 8
arr[5] = 8

step4:
通过push_back函数,将int数组转为string;

push_back的用法:

在C++中,std::string类提供了一个push_back成员函数,用于向字符串末尾添加一个字符。

使用push_back函数的语法如下:

string_variable.push_back(character);

其中,string_variable是一个std::string类型的变量,character是要添加到字符串末尾的字符。

以下是一个示例:

#include 
#include 

int main() {
    std::string str = "Hello";
    str.push_back('!');
    std::cout << str << std::endl; // 输出:Hello!

    return 0;
}

在上面的示例中,我们首先创建了一个字符串str,然后使用push_back函数将字符'!'添加到字符串末尾。最后,我们输出字符串str的内容,结果为Hello!

注意,push_back函数只能用于向字符串末尾添加一个字符。如果要添加多个字符,可以使用+=操作符或append函数。

你可能感兴趣的:(leetcode,c++)