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)。

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

相关文章
|
Ubuntu Docker 容器
ubuntu 桌面 docker 镜像 vnc
ubuntu 桌面 docker 镜像 vnc
380 0
|
缓存 网络协议 算法
Netty的基础入门(上)
Netty的基础入门(上)
544 1
|
分布式计算 资源调度 Hadoop
HBase表数据的读、写操作与综合操作
HBase表数据的读、写操作与综合操作
312 0
|
SQL 关系型数据库 MySQL
使用CTAS 把mysql 表同步数据 到hologres ,Flink有什么参数可以使hologres 的字段都小写吗?
使用CTAS 把mysql 表同步数据 到hologres ,Flink有什么参数可以使hologres 的字段都小写吗?
448 0
|
iOS开发 MacOS
还在为 iTerm 多窗口操作烦恼?tmux 这款神器轻松帮你解决(下)
粉在之前文章中教过大家如何结合 zsh 让 iterm2 发挥最佳效果。 什么还没有看过?赶紧看下补一下前提知识:收集了这么多实用技巧,帮助你的 iterm2 成为最帅的那个! 上篇文中,阿粉提到每次上线发布的时候,都会打开很多 iTerm 窗口,通过 tab 页拖拽方式让所有窗口可以同时显示。
1421 0
还在为 iTerm 多窗口操作烦恼?tmux 这款神器轻松帮你解决(下)
|
安全 数据安全/隐私保护
阿里云账号开启手机号登录方法
阿里云账号开启手机号验证码登录方法
2864 0
阿里云账号开启手机号登录方法
|
存储 C语言
【数据结构】顺序表(c语言实现)(附源码)
本文介绍了线性表和顺序表的基本概念及其实现。线性表是一种有限序列,常见的线性表有顺序表、链表、栈、队列等。顺序表是一种基于连续内存地址存储数据的数据结构,其底层逻辑是数组。文章详细讲解了静态顺序表和动态顺序表的区别,并重点介绍了动态顺序表的实现,包括初始化、销毁、打印、增删查改等操作。最后,文章总结了顺序表的时间复杂度和局限性,并预告了后续关于链表的内容。
401 3
|
Android开发
Android实战之如何快速实现自动轮播图
本文介绍了在 Android 中使用 `ViewPager2` 和自定义适配器实现轮播图的方法,包括添加依赖、布局配置、创建适配器及实现自动轮播等步骤。
537 0
|
算法 索引
【D3.js - v5.x】(5)绘制力导向图 | 附完整代码
【D3.js - v5.x】(5)绘制力导向图 | 附完整代码
968 0
【D3.js - v5.x】(5)绘制力导向图 | 附完整代码
|
机器学习/深度学习 人工智能 物联网
快速玩转 Llama2!机器学习 PAI 最佳实践(三)—快速部署WebUI
本实践将采用阿里云机器学习平台PAI-EAS 模块针对 Llama-2-13B-chat 进行部署。PAI-EAS是模型在线服务平台,支持将模型一键部署为在线推理服务或AI-Web应用,具备弹性扩缩的特点,适合需求高性价比模型服务的开发者。
2041 4