8月每日在leetcode至少做一题,9月份开始有点懈怠了,希望可以继续保持吧。每天学习和进步一点,才能保持感觉,对算法的应用场景上,嗅觉也会更灵敏一点点,有合适的场景就能用起来,毕竟解决了实际的问题,算法才提现价值。
今天做的是leetcode的第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)或直接将输入转换为整数来处理。
思路
看到说明里面的最后一条,我差点笑出声,其实很多年之前在学校刷题的时候也做过类似的,我们有个同学就是靠java的BigDecimal过的。当然这样过就失去意义了,我们还是探寻一下一般的解法。
回到小学的多位数相乘,其实就是把其中一个数字逐位拆开,与另外一个数去相乘,然后再把和相加。这样就从多位数乘法简化成了一位数乘以多位数;然后进一步简化成一位数乘以一位数再相加。
我们现在用程序来解,就是模拟了这个过程,如下图所示
当然,这道题目做的过程中也有一些注意点:
1、注意补零,逐位相乘的时候,高位数去做乘法时,后面是要补零的,如上图的竖式所示
2、数字可能很长,中间的结果也要用数组表示,用整数的话可能会溢出
3、虽然原字符串遍历完了,但是可能还有从低位进位上来的数组,别丢了
所以,本题还需要一个隐含的函数,就是2个字符串类型的数字相加,这其实就是leetcode第415题,字符串相加
Java版本代码
1 | ini复制代码class Solution { |
本文转载自: 掘金