精选50题之 43. 字符串相乘

腾讯精选练习(50 题)之 43. 字符串相乘

原题目链接

给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。

示例 1:
输入: num1 = “2”, num2 = “3”
输出: “6”

示例 2:
输入: num1 = “123”, num2 = “456”
输出: “56088”

说明:
num1 和 num2 的长度小于110。
num1 和 num2 只包含数字 0-9。
num1 和 num2 均不以零开头,除非是数字 0 本身。
不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。

直接实现

虽然提示不要使用字符串转换为整数计算,但还是尝试了一下…

class Solution {
public:
    string multiply(string num1, string num2) {
        long long int l1 = atoi(num1.c_str());
        long long int l2 = atoi(num2.c_str());
        string res = std::to_string(l1 * l2);
        return res;
    }
};

在这里插入图片描述
不多说,好好做题。

题目分析

不能转化为整型计算,且输入为字符串,很自然地想到用ASCII码的差值表示数字。
得到“数字“之后,如何计算呢?

一种思路是,建立一个大的缓冲区,然后对应位置相乘…这样思路不错,但实现会很复杂,因为每一句判断条件,都需要多行代码实现(挖个坑,先留着,以后填)。

还有一种思路,就是模拟手写的竖式乘法:
Celia的回答 描述的很详细,很有启发。

解题分析

代码中注释

代码实现

class Solution {
public:
    string multiply(string num1, string num2) {
        int l1 = num1.size();
        int l2 = num2.size();
        string ans(l1 + l2, '0'); //初始化为'0'
        for (int i = l1 - 1; i >= 0; --i)
        {
            for (int j = l2 - 1; j >= 0; --j)
            {
                int sum = (ans[i + j + 1] - '0') + (num1[i] - '0') * (num2[j] - '0');        
                ans[i + j + 1] = (sum % 10) + '0'; //当前位
                ans[i + j] += sum / 10; //前一位加上进位,res[i+j]已经初始化为'0',加上int类型自动转化为char,所以此处不加'0'
            }
        }
        for (int i = 0; i < ans.size(); ++i)
        {
            if (ans[i] != '0' || i == ans.size() - 1) 
                return ans.substr(i);
        }
        return "";
    }
};

在这里插入图片描述
复杂度分析:

  • 时间复杂度:O(MN)——>O(N^2)
  • 空间复杂度:O(M+N)——>O(N)

写在最后

还有一些没有写清楚,先到这里。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值