Multiply Strings——面试题
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)
- class Solution {
- public:
- string multiply(string num1, string num2) {
- int n1 = num1.length();
- int n2 = num2.length();
- if(n1 == || n2 == ) return "";
- int upto = ;
- int sumupto = ;
- string sum;
- int s = ;
- sum.resize(n1+n2, '');
- int i, j;
- for (i = n1-; i >= ; i--)
- {
- int a = num1[i] - '';
- //注意:每次新开始upto进位值都要清零
- for (j = n2-, upto = ; j >= ; j--)
- {
- int b = num2[j] - '';
- s = b * a + upto;
- upto = s / ;
- //注意:要系统分析,先计算出乘法,处理好,之后再处理加法。
- int rmd = s%;
- int sij1 = sum[i+j+] - '';
- int rs = rmd + sij1 + sumupto;
- sumupto = rs/;
- rs %= ;
- sum[i+j+] = rs + '';
- }
- //注意:把最后一次的进位值加上!
- //注意:要把加法进位和乘法进位都加上
- sum[i+j+] += (upto+sumupto);
- //注意:加法进位一定需要清零
- sumupto = ;
- }
- while (sum.length() > && sum[] == '') sum.erase(sum.begin());
- return sum;
- }
- };
上面是网上的答案,各种进位好凌乱,其实不需要这么复杂,对于每一位,把相乘的结果加上上一次的进位结果加上原来这个位置就有的数,然后统一计算下一次的进位。这样做,简洁的多了,也好理解多了,代码如下:
(面试腾讯实习生的时候遇到这道题,所以又重做了一遍,我在编译器中用的是strNum1, strNum2,所以在leetcode中直接赋值了)
- class Solution {
- public:
- string multiply(string num1, string num2) {
- string strNum1, strNum2;
- strNum1=num1;
- strNum2=num2;
- int strLen1 = strNum1.size();
- int strLen2 = strNum2.size();
- if (strLen1 <= || strLen2 <= )
- return “”;
- string res(strLen1 + strLen2, '');
- int carryM = ;
- int carryP = ;
- int i, j;
- for ( i = strLen1 - ; i >= ; i--)
- {
- int sNum1 = strNum1[i] - '';
- for ( j = strLen2 - ; j >= ; j--)
- {
- int sNum2 = strNum2[j] - '';
- int sum = sNum1*(strNum2[j] - '') + carryP + (res[i + j + ] - '');
- carryP = sum / ;
- int num = sum % ;
- res[i + j + ] = num + '';
- }
- res[i + j + ] = carryP+'';
- carryP = ;
- }
- while (res.length() > && res[] == '') res.erase(res.begin());
- return res;
- }
- };
Multiply Strings——面试题的更多相关文章
- leetcode面试准备:Multiply Strings
1 题目 Given two numbers represented as strings, return multiplication of the numbers as a string. Not ...
- 【leetcode】Multiply Strings
Multiply Strings Given two numbers represented as strings, return multiplication of the numbers as a ...
- [Leetcode][Python]43: Multiply Strings
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 43: Multiply Stringshttps://leetcode.co ...
- 【LeetCode练习题】Multiply Strings
Multiply Strings Given two numbers represented as strings, return multiplication of the numbers as a ...
- [LeetCode] 415 Add Strings && 67 Add Binary && 43 Multiply Strings
这些题目是高精度加法和高精度乘法相关的,复习了一下就做了,没想到难住自己的是C++里面string的用法. 原题地址: 415 Add Strings:https://leetcode.com/pro ...
- [LeetCode] 43. Multiply Strings ☆☆☆(字符串相乘)
转载:43. Multiply Strings 题目描述 就是两个数相乘,输出结果,只不过数字很大很大,都是用 String 存储的.也就是传说中的大数相乘. 解法一 我们就模仿我们在纸上做乘法的过程 ...
- 【LeetCode】43. Multiply Strings
Multiply Strings Given two numbers represented as strings, return multiplication of the numbers as a ...
- LeetCode: Multiply Strings 解题报告
Multiply StringsGiven two numbers represented as strings, return multiplication of the numbers as a ...
- Multiply Strings 字符串相乘
http://www.cnblogs.com/TenosDoIt/p/3735309.html https://blog.csdn.net/fly_yr/article/details/4805561 ...
随机推荐
- SRM13 T3 花六游鸟小(结论题)
哇这题是真的喵,HR智商太高辣 这题的难点就是看了题解之后怎么证明题解里的结论... 结论①:深度大于logm的点肯定能达到最大值 证明:显然一个西瓜的属性里0数量一半1数量一半我们取到的1数量最少, ...
- [iptables]iptables日志记录
Mar :: kernel: [:] IN=eth1 OUT= MAC=f0:1f:af:da:6f:1e::fb::ae:fa::: SRC= TOS= ID= DF PROTO=TCP SPT= ...
- POJ2528 线段树离散化
Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 62771 Accepted: 18120 ...
- ios开关按钮
.al-toggle-button{ appearance: none; -webkit-appearance: none; position: relative; width: 52px; heig ...
- Eclipse debug模式下使用16进制(Hex)查看变量值
转载自:http://blog.csdn.net/jinhill/article/details/5767035 因为工作中需要查看byte[]原始编码,eclipse中debug模式下默认查看byt ...
- 【通用邮件发送】C# QQ 网易邮箱
using BooksStore.Domain.Models; using System; using System.Collections.Generic; using System.Linq; u ...
- [洛谷P3338] [ZJOI2014]力
洛谷题目链接:P3338 [ZJOI2014]力 题目描述 给出n个数qi,给出Fj的定义如下: \[F_j = \sum_{i<j}\frac{q_i q_j}{(i-j)^2 }-\sum_ ...
- 【洛谷 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 ...
- 2、MySQL常见数据库引擎及比较?
MySQL存储引擎简介 MySQL支持数个存储引擎作为对不同表的类型的处理器.MySQL存储引擎包括处理事务安全表的引擎和处理非事务安全表的引擎: MyISAM管理非事务表.它提供高速存储和检索,以及 ...
- JavaScript字符串逆序
如何对字符串进行倒序呢?你首先想到的方法就是生成一个栈,从尾到头依次取出字符串中的字符压入栈中,然后把栈连接成字符串. var reverse = function( str ){ var stack ...