iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++实现LeetCode(43.字符串相乘)
  • 253
分享到

C++实现LeetCode(43.字符串相乘)

2024-04-02 19:04:59 253人浏览 安东尼
摘要

[LeetCode] 43. Multiply Strings 字符串相乘 Given two non-negative integers num1 and

[LeetCode] 43. Multiply Strings 字符串相乘

Given two non-negative integers num1 and num2represented as strings, return the product of num1 and num2, also represented as a string.

Example 1:

Input: num1 = "2", num2 = "3"
Output: "6"

Example 2:

Input: num1 = "123", num2 = "456"
Output: "56088"

Note:

  1. The length of both num1 and num2 is < 110.
  2. Both num1 and num2 contain only digits 0-9.
  3. Both num1 and num2 do not contain any leading zero, except the number 0 itself.
  4. You must not use any built-in BigInteger libraryor convert the inputs to integer directly.

这道题让我们求两个字符串数字的相乘,输入的两个数和返回的数都是以字符串格式储存的,这样做的原因可能是这样可以计算超大数相乘,可以不受 int 或 long 的数值范围的约束,那么该如何来计算乘法呢,小时候都学过多位数的乘法过程,都是每位相乘然后错位相加,那么这里就是用到这种方法,举个例子,比如 89 x 76,那么根据小学的算术知识,不难写出计算过程如下:

8 9  <- num2

    7 6  <- num1

-------

    5 4

  4 8

  6 3

5 6

-------

如果自己再写些例子出来,不难发现,两数相乘得到的乘积的长度其实其实不会超过两个数字的长度之和,若 num1 长度为m,num2 长度为n,则 num1 x num2 的长度不会超过 m+n,还有就是要明白乘的时候为什么要错位,比如6乘8得到的 48 为啥要跟6乘9得到的 54 错位相加,因为8是十位上的数字,其本身相当于80,所以错开的一位实际上末尾需要补的0。还有一点需要观察出来的就是,num1 和 num2 中任意位置的两个数字相乘,得到的两位数在最终结果中的位置是确定的,比如 num1 中位置为i的数字乘以 num2 中位置为j的数字,那么得到的两位数字的位置为 i+j 和 i+j+1,明白了这些后,就可以进行错位相加了,累加出最终的结果。

由于要从个位上开始相乘,所以从 num1 和 num2 字符串的尾部开始往前遍历,分别提取出对应位置上的字符,将其转为整型后相乘。然后确定相乘后的两位数所在的位置 p1 和 p2,由于 p2 相较于 p1 是低位,所以将得到的两位数 mul 先加到 p2 位置上去,这样可能会导致 p2 位上的数字大于9,所以将十位上的数字要加到高位 p1 上去,只将余数留在 p2 位置,这样每个位上的数字都变成一位。然后要做的是从高位开始,将数字存入结果 res 中,记住 leading zeros 要跳过,最后处理下 corner case,即若结果 res 为空,则返回 "0",否则返回结果 res,代码如下:


class Solution {
public:
    string multiply(string num1, string num2) {
        string res = "";
        int m = num1.size(), n = num2.size();
        vector<int> vals(m + n);
        for (int i = m - 1; i >= 0; --i) {
            for (int j = n - 1; j >= 0; --j) {
                int mul = (num1[i] - '0') * (num2[j] - '0');
                int p1 = i + j, p2 = i + j + 1, sum = mul + vals[p2];
                vals[p1] += sum / 10;
                vals[p2] = sum % 10;
            }
        }
        for (int val : vals) {
            if (!res.empty() || val != 0) res.push_back(val + '0');
        }
        return res.empty() ? "0" : res;
    }
};

到此这篇关于c++实现LeetCode(43.字符串相乘)的文章就介绍到这了,更多相关C++实现字符串相乘内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++实现LeetCode(43.字符串相乘)

本文链接: https://www.lsjlt.com/news/130561.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++实现LeetCode(43.字符串相乘)
    [LeetCode] 43. Multiply Strings 字符串相乘 Given two non-negative integers num1 and...
    99+
    2022-11-12
  • C++实现LeetCode(97.交织相错的字符串)
    [LeetCode] 97.Interleaving String 交织相错的字符串 Given s1, s2, s3, find whether...
    99+
    2022-11-12
  • C语言超详细讲解字符串相乘
    目录前言一、分析思路二、使用步骤1、代码如下2、memset函数三、总结前言 我们已经知道,正常的两位整形数据通过*相乘,C语言中int为4字节,32bit(字节),其机器码第一位为...
    99+
    2022-11-13
  • C++实现LeetCode(205.同构字符串)
    [LeetCode] 205. Isomorphic Strings 同构字符串 Given two strings s and t, determi...
    99+
    2022-11-12
  • C++实现LeetCode(87.搅乱字符串)
    [LeetCode] 87. Scramble String 搅乱字符串 Given a string s1, we may represent it as a binar...
    99+
    2022-11-12
  • C语言中字符串相乘的示例分析
    这篇文章主要介绍C语言中字符串相乘的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一. 分析思路示例:我们把每一个数都看成是一个字符串,每一个元素为十进制数字所对应的字 符,由于是后面的元素先进行运算,故我们...
    99+
    2023-06-29
  • C++实现LeetCode(6.字型转换字符串)
    [LeetCode] 6. ZigZag Conversion 之字型转换字符串 The string "PAYPALISHIRING" is written i...
    99+
    2022-11-12
  • C++实现LeetCode(647.回文子字符串)
    [LeetCode] 647. Palindromic Substrings 回文子字符串 Given a string, your task is to count how man...
    99+
    2022-11-12
  • C++实现LeetCode(125.验证回文字符串)
    [LeetCode] 125.Valid Palindrome 验证回文字符串 Given a string, determine if it is a palindrome, co...
    99+
    2022-11-12
  • C++实现LeetCode(8.字符串转为整数)
    [LeetCode] 8. String to Integer (atoi) 字符串转为整数 Implement atoi which converts...
    99+
    2022-11-12
  • C++实现LeetCode字型转换字符串的方法
    这篇文章主要介绍“C++实现LeetCode字型转换字符串的方法”,在日常操作中,相信很多人在C++实现LeetCode字型转换字符串的方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++实现LeetCo...
    99+
    2023-06-20
  • python如何实现字符串乘法
    这篇文章主要为大家展示了“python如何实现字符串乘法”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“python如何实现字符串乘法”这篇文章吧。字符串乘法在Python中,不仅可以乘以数字,还...
    99+
    2023-06-27
  • C++实现LeetCode(151.翻转字符串中的单词)
    [LeetCode] 151.Reverse Words in a String 翻转字符串中的单词 Given an input string, reverse the strin...
    99+
    2022-11-12
  • C#怎么实现字符串包含字符串
    本文小编为大家详细介绍“C#怎么实现字符串包含字符串”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#怎么实现字符串包含字符串”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。实例using System...
    99+
    2023-06-17
  • C++实现字符串和整数的相互转换
    目录字符串转换整数方法1方法2(推荐)整数转换字符串字符串转换整数 方法1 #include <iostream> #include <typeinfo> ...
    99+
    2023-01-03
    C++字符串转整数 C++整数转字符串 C++ 整数 字符串
  • python怎么实现两个字符串乘法
    这篇文章主要介绍“python怎么实现两个字符串乘法”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“python怎么实现两个字符串乘法”文章能帮助大家解决问题。两个字符串相乘,基本思路是num1依次乘...
    99+
    2023-06-29
  • C++实现leetcode(3.最长无重复字符的子串)
    [LeetCode] 3. Longest Substring Without Repeating Characters 最长无重复字符的子串 Given a string, fin...
    99+
    2022-11-12
  • C++实现LeetCode(186.翻转字符串中的单词之二)
    [LeetCode] 186. Reverse Words in a String II 翻转字符串中的单词之二 Given an input string , rever...
    99+
    2022-11-12
  • C++实现LeetCode(557.翻转字符串中的单词之三)
    [LeetCode] 557.Reverse Words in a String III 翻转字符串中的单词之三 Given a string, you need to revers...
    99+
    2022-11-12
  • python 实现两个字符串乘法小练习
    两个字符串相乘,基本思路是num1依次乘以num2各个数位上的数字,再将其累加,如下图所示: 需要注意的是,对于高位的乘积,需要在后面补0,0的个数和num2的数位有关系,十位补1...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作