leetcode第43题

简介: 个位乘个位,得出一个数,然后个位乘十位,全部乘完以后,就再用十位乘以各个位。然后百位乘以各个位,最后将每次得出的数相加。十位的结果要补 1 个 0 ,百位的结果要补两个 0 。相加的话我们可以直接用之前的大数相加。直接看代码吧。

image.png

就是两个数相乘,输出结果,只不过数字很大很大,都是用 String 存储的。也就是传说中的大数相乘。

解法一

我们就模仿我们在纸上做乘法的过程写出一个算法。

image.png

个位乘个位,得出一个数,然后个位乘十位,全部乘完以后,就再用十位乘以各个位。然后百位乘以各个位,最后将每次得出的数相加。十位的结果要补 1 个 0 ,百位的结果要补两个 0 。相加的话我们可以直接用之前的大数相加。直接看代码吧。

publicStringmultiply(Stringnum1, Stringnum2) {
if (num1.equals("0") ||num2.equals("0")) {
return"0";
    }  
Stringans="0";
intindex=0; //记录当前是哪一位,便于后边补 0 for (inti=num2.length() -1; i>=0; i--) {
intcarry=0; //保存进位Stringans_part=""; //直接用字符串保存每位乘出来的数intm=num2.charAt(i) -'0';
//乘上每一位for (intj=num1.length() -1; j>=0; j--) {
intn=num1.charAt(j) -'0';
intmul=m*n+carry; 
ans_part=mul%10+""+ans_part;
carry=mul/10;
        }
if (carry>0) {
ans_part=carry+""+ans_part;
        }
//补 0 for (intk=0; k<index; k++) {
ans_part=ans_part+"0";
        }
index++;
//和之前的结果相加ans=sumString(ans, ans_part);
    }
returnans;
}
//大数相加privateStringsumString(Stringnum1, Stringnum2) {
intcarry=0;
intnum1_index=num1.length() -1;
intnum2_index=num2.length() -1;
Stringans="";
while (num1_index>=0||num2_index>=0) {
intn1=num1_index>=0?num1.charAt(num1_index) -'0' : 0;
intn2=num2_index>=0?num2.charAt(num2_index) -'0' : 0;
intsum=n1+n2+carry;
carry=sum/10;
ans=sum%10+""+ans;
num1_index--;
num2_index--;
    }
if (carry>0) {
ans=carry+""+ans;
    }
returnans;
}

时间复杂度:O(m * n)。m,n 是两个字符串的长度。

空间复杂度:O(1)。

如果按普通的思路写,这道题也不难。新的竖式的计算,让人眼前一亮,代码优雅了很多。

相关文章
|
4月前
|
消息中间件 Kubernetes NoSQL
LeetCode 1359、1360
LeetCode 1359、1360
|
存储
leetcode:53.最大字序和
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
45 0
leetcode 283 移动零
leetcode 283 移动零
50 0
leetcode第53题
解法一和解法二的动态规划,只是在定义的时候一个表示以 i 开头的子数组,一个表示以 i 结尾的子数组,却造成了时间复杂度的差异。问题就是解法一中求出了太多的没必要的和,不如解法二直接,只保存最大的和。
leetcode第53题
|
算法
leetcode第40题
会发现出现了很多重复的结果,就是因为没有跳过重复的 1。在求 opt [ 1 ] 的时候就变成了 [ [ 1 ],[ 1 ] ] 这样子,由于后边求的时候都是直接在原来每一个列表里加数字,所有后边都是加了两次了。
leetcode第40题
leetcode第37题
从上到下,从左到右遍历每个空位置。在第一个位置,随便填一个可以填的数字,再在第二个位置填一个可以填的数字,一直执行下去直到最后一个位置。期间如果出现没有数字可以填的话,就回退到上一个位置,换一下数字,再向后进行下去。
leetcode第37题
leetcode第46题
这是自己开始想到的一个方法,考虑的思路是,先考虑小问题怎么解决,然后再利用小问题去解决大问题。没错,就是递归的思路。比如说, 如果只有 1 个数字 [ 1 ],那么很简单,直接返回 [ [ 1 ] ] 就 OK 了。 如果加了 1 个数字 2, [ 1 2 ] 该怎么办呢?我们只需要在上边的情况里,在 1 的空隙,也就是左边右边插入 2 就够了。变成 [ [ 2 1 ], [ 1 2 ] ]。
leetcode第46题
leetcode第51题
较经典的回溯问题了,我们需要做的就是先在第一行放一个皇后,然后进入回溯,放下一行皇后的位置,一直走下去,如果已经放的皇后的数目等于 n 了,就加到最后的结果中。然后再回到上一行,变化皇后的位置,然后去找其他的解。 期间如果遇到当前行所有的位置都不能放皇后了,就再回到上一行,然后变化皇后的位置。再返回到下一行。 说起来可能还费力些,直接看代码吧。
leetcode第51题
|
存储 算法
leetcode第49题
时间复杂度:两层 for 循环,再加上比较字符串,如果字符串最长为 K,总的时间复杂度就是 O(n²K)。 空间复杂度:O(NK),用来存储结果。 解法一算是比较通用的解法,不管字符串里边是大写字母,小写字母,数字,都可以用这个算法解决。这道题的话,题目告诉我们字符串中只有小写字母,针对这个限制,我们可以再用一些针对性强的算法。 下边的算法本质是,我们只要把一类的字符串用某一种方法唯一的映射到同一个位置就可以。
144 0
leetcode第49题
leetcode第28题
返回一个字符串 needle 在另一个字符串 haystack 中开始的位置,如果不存在就返回 -1 ,如果 needle 长度是 0 ,就返回 0 。 就是一一比较就好,看下代码吧。
leetcode第28题