Given two numbers represented as strings, return multiplication of the numbers as a string.

Note: The numbers can be arbitrarily large and are non-negative.

这道题就是模拟乘法思维了,还需要模拟加法思维,每一位乘以一个数都要和前面的结果加起来。

注意:

1 要把这两个操作过程分清楚,不能混饶了,否则会结果不正确的。

2 乘法有进位,和前面的结果加起来也有加法进位,一定要分清楚。

3 每一次一个新数位与被乘数相乘之前,都一定要把两个进位加在结果上。

4 同时需要把两个进位值都清零。

整体思路:

这道题的要求是计算大数乘法。其中大数是以字符串的形式表示,任意大,非负,返回结果以字符串形式。

这道题其实就是模拟整数乘法。

假设两个整数的长度分别为了l1和l2,则其最后结果长度为l1+l2(最后有进位)或者l1+l2-1(最后没有有进位)。

因此,可以先用长度为l1+l2的数组记录结果,最后再转成字符串。

进行乘法的时候,先把各个位的相乘结果对应累加起来,即第1个整数的第i位(低位到高位)和第2个整数的第j位(低位到高位)相乘的结果应该存放在数组的i+j位。然后再统一处理进位。

然后再统一处理进位。

最后再将数组转成字符串前,需要跳过前面的零。如果结果只有0,则只返回0。

时间复杂度:O(l1l2)(l1和l2分别为两个整数长度)

空间复杂度:O(l1+l2)

  1. class Solution {
  2. public:
  3. string multiply(string num1, string num2) {
  4. int n1 = num1.length();
  5. int n2 = num2.length();
  6. if(n1 == || n2 == ) return "";
  7. int upto = ;
  8. int sumupto = ;
  9. string sum;
  10. int s = ;
  11. sum.resize(n1+n2, '');
  12. int i, j;
  13. for (i = n1-; i >= ; i--)
  14. {
  15. int a = num1[i] - '';
  16. //注意:每次新开始upto进位值都要清零
  17. for (j = n2-, upto = ; j >= ; j--)
  18. {
  19. int b = num2[j] - '';
  20. s = b * a + upto;
  21. upto = s / ;
  22. //注意:要系统分析,先计算出乘法,处理好,之后再处理加法。
  23.  
  24. int rmd = s%;
  25. int sij1 = sum[i+j+] - '';
  26. int rs = rmd + sij1 + sumupto;
  27.  
  28. sumupto = rs/;
  29. rs %= ;
  30. sum[i+j+] = rs + '';
  31. }
  32. //注意:把最后一次的进位值加上!
  33. //注意:要把加法进位和乘法进位都加上
  34. sum[i+j+] += (upto+sumupto);
  35. //注意:加法进位一定需要清零
  36. sumupto = ;
  37. }
  38. while (sum.length() > && sum[] == '') sum.erase(sum.begin());
  39.  
  40. return sum;
  41.  
  42. }
  43. };

上面是网上的答案,各种进位好凌乱,其实不需要这么复杂,对于每一位,把相乘的结果加上上一次的进位结果加上原来这个位置就有的数,然后统一计算下一次的进位。这样做,简洁的多了,也好理解多了,代码如下:

(面试腾讯实习生的时候遇到这道题,所以又重做了一遍,我在编译器中用的是strNum1, strNum2,所以在leetcode中直接赋值了)

  1. class Solution {
  2. public:
  3. string multiply(string num1, string num2) {
  4. string strNum1, strNum2;
  5. strNum1=num1;
  6. strNum2=num2;
  7. int strLen1 = strNum1.size();
  8. int strLen2 = strNum2.size();
  9. if (strLen1 <= || strLen2 <= )
  10. return “”;
  11. string res(strLen1 + strLen2, '');
  12. int carryM = ;
  13. int carryP = ;
  14. int i, j;
  15. for ( i = strLen1 - ; i >= ; i--)
  16. {
  17. int sNum1 = strNum1[i] - '';
  18. for ( j = strLen2 - ; j >= ; j--)
  19. {
  20. int sNum2 = strNum2[j] - '';
  21. int sum = sNum1*(strNum2[j] - '') + carryP + (res[i + j + ] - '');
  22. carryP = sum / ;
  23. int num = sum % ;
  24. res[i + j + ] = num + '';
  25. }
  26. res[i + j + ] = carryP+'';
  27. carryP = ;
  28. }
  29. while (res.length() > && res[] == '') res.erase(res.begin());
  30. return res;
  31. }
  32. };

Multiply Strings——面试题的更多相关文章

  1. leetcode面试准备:Multiply Strings

    1 题目 Given two numbers represented as strings, return multiplication of the numbers as a string. Not ...

  2. 【leetcode】Multiply Strings

    Multiply Strings Given two numbers represented as strings, return multiplication of the numbers as a ...

  3. [Leetcode][Python]43: Multiply Strings

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 43: Multiply Stringshttps://leetcode.co ...

  4. 【LeetCode练习题】Multiply Strings

    Multiply Strings Given two numbers represented as strings, return multiplication of the numbers as a ...

  5. [LeetCode] 415 Add Strings && 67 Add Binary && 43 Multiply Strings

    这些题目是高精度加法和高精度乘法相关的,复习了一下就做了,没想到难住自己的是C++里面string的用法. 原题地址: 415 Add Strings:https://leetcode.com/pro ...

  6. [LeetCode] 43. Multiply Strings ☆☆☆(字符串相乘)

    转载:43. Multiply Strings 题目描述 就是两个数相乘,输出结果,只不过数字很大很大,都是用 String 存储的.也就是传说中的大数相乘. 解法一 我们就模仿我们在纸上做乘法的过程 ...

  7. 【LeetCode】43. Multiply Strings

    Multiply Strings Given two numbers represented as strings, return multiplication of the numbers as a ...

  8. LeetCode: Multiply Strings 解题报告

    Multiply StringsGiven two numbers represented as strings, return multiplication of the numbers as a ...

  9. Multiply Strings 字符串相乘

    http://www.cnblogs.com/TenosDoIt/p/3735309.html https://blog.csdn.net/fly_yr/article/details/4805561 ...

随机推荐

  1. SRM13 T3 花六游鸟小(结论题)

    哇这题是真的喵,HR智商太高辣 这题的难点就是看了题解之后怎么证明题解里的结论... 结论①:深度大于logm的点肯定能达到最大值 证明:显然一个西瓜的属性里0数量一半1数量一半我们取到的1数量最少, ...

  2. [iptables]iptables日志记录

    Mar :: kernel: [:] IN=eth1 OUT= MAC=f0:1f:af:da:6f:1e::fb::ae:fa::: SRC= TOS= ID= DF PROTO=TCP SPT= ...

  3. POJ2528 线段树离散化

    Mayor's posters Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 62771   Accepted: 18120 ...

  4. ios开关按钮

    .al-toggle-button{ appearance: none; -webkit-appearance: none; position: relative; width: 52px; heig ...

  5. Eclipse debug模式下使用16进制(Hex)查看变量值

    转载自:http://blog.csdn.net/jinhill/article/details/5767035 因为工作中需要查看byte[]原始编码,eclipse中debug模式下默认查看byt ...

  6. 【通用邮件发送】C# QQ 网易邮箱

    using BooksStore.Domain.Models; using System; using System.Collections.Generic; using System.Linq; u ...

  7. [洛谷P3338] [ZJOI2014]力

    洛谷题目链接:P3338 [ZJOI2014]力 题目描述 给出n个数qi,给出Fj的定义如下: \[F_j = \sum_{i<j}\frac{q_i q_j}{(i-j)^2 }-\sum_ ...

  8. 【洛谷 P3628】 [APIO2010]特别行动队 (斜率优化)

    题目链接 斜率优化总结待补,请催更.不催更不补 \[f[i]=f[j]+a*(sum[i]-sum[j])^2+b*(sum[i]-sum[j])+c\] \[=f[j]+a*sum[i]^2+a*s ...

  9. 2、MySQL常见数据库引擎及比较?

    MySQL存储引擎简介 MySQL支持数个存储引擎作为对不同表的类型的处理器.MySQL存储引擎包括处理事务安全表的引擎和处理非事务安全表的引擎: MyISAM管理非事务表.它提供高速存储和检索,以及 ...

  10. JavaScript字符串逆序

    如何对字符串进行倒序呢?你首先想到的方法就是生成一个栈,从尾到头依次取出字符串中的字符压入栈中,然后把栈连接成字符串. var reverse = function( str ){ var stack ...