Leetcode 43. 字符串相乘

【中等】力扣算法题解析LeetCode43:字符串相乘 本文介绍了如何在不使用内置大整数库的情况下,实现两个字符串形式的大整数乘法。算法通过模拟手工乘法过程,逐位相乘并处理进位,最终将结果转换为字符串。关键步骤包括初始化结果数组、双重循环逐位计算乘积、处理进位以及跳过前导零转换为字符串。该方法的时间复杂度为O(n²),空间复杂度为O(n),适用于大整数运算场景。 阅读详情

题目

给定两个以字符串形式表示的非负整数 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)或直接将输入转换为整数来处理。

解答

解法一:平行乘法

这是最直观的解法,最符合我们平时计算乘法的方式。

分为以下几步:

  1. 从低到高位计算出每一行的乘积字符串。
  2. 将计算出的每一行乘积字符串补上合适个数的 0 ,并保存起来。
  3. 对所有的乘积字符串进行字符串加法运算。(融合操作类似于合并 k 个有序链表,可以自行优化或博客)

代码挺长,但很简单。

深入学习这种解法也能学到不少东西,包括字符串加法,合并 k 个有序链表的应用。

代码
class Solution {
    public String multiply(String num1, String num2) {
        if(num1 == null || num1.length() == 0) return "0";
        if("0".equals(num1) || "0".equals(num2)) return "0";
        
        String[] results = new String[num1.length()];
        for(int i = num1.length() - 1; i >= 0; i --) {
            int n1Val = num1.charAt(i) - '0';
            int carry = 0;
            StringBuilder cur = new StringBuilder();
            for(int j = num2.length() - 1; j >= 0; j --) {
                int n2Val = num2.charAt(j) - '0';
                int sum = carry + n1Val * n2Val;
                carry = sum / 10;
                cur.append(sum % 10);
            }
            
            cur.append(carry != 0 ? carry : "");
            results[i] = cur.reverse().append(generateZero(num1.length() - i - 1)).toString();
        }
        
        // 这一部分融合操作可以优化成 分治 算法,效率更高。
        // 类似于合并 k 个有序链表。
        // 这里简单起见,我并没有优化,感兴趣的同学可以做一下优化。
        String res = results[0];
        for(int i = 1; i < results.length; i ++) {
            res = addStrings(res, results[i]);
        }
        
        return res;
    }
    
    private String generateZero(int n) {
        char[] zeros = new char[n];
        Arrays.fill(zeros, '0');
        return new String(zeros);
    }
    
    private String addStrings(String num1, String num2) {
        StringBuilder res = new StringBuilder();
        int carry = 0;
        int i = num1.length() - 1;
        int j = num2.length() - 1;
        while(i >= 0 || j >= 0 || carry != 0) {
            int num1Val = i >= 0 ? num1.charAt(i) - '0' : 0;
            int num2Val = j >= 0 ? num2.charAt(j) - '0' : 0;
            int sum = carry + num1Val + num2Val;
            carry = sum / 10;
            
            res.append(sum % 10);
            
            if(i >= 0) i --;
            if(j >= 0) j --;
        }
        
        return res.reverse().toString();
    }
}
结果

在这里插入图片描述

解法二:竖式乘法

首先需要知道一点:两个数字相乘,最后的结果的长度必然小于两者的长度之和。

竖式乘法就是采用的这种思想,相当于将结果整个采用数组的方式存储。

手画了一个简单的图,画的粗糙,见谅 :)
在这里插入图片描述
图中结果数组中的第 k 位在哪些情况下会被修改呢?

现在我们假设 num1 当前的位置是 i ,num2 当前的位置是 j 。

那么可以看出:i + j + 1 == k 时第 k 位会被直接修改,同时也可能会进位第 k - 1 位。

具体情况如下:

  1. 结果的 第 k 位 上的值就是(原来第 k 位的值 ret[k] + 增量 num1[i] * num2[j] )之和的余数。
  2. 结果的 第 k - 1 位,可能会得到 ret[k] + num1[i] * num2[j] 运算产生的进位。
代码
class Solution {
    public String multiply(String num1, String num2) {
        
        char[] ret = new char[num1.length() + num2.length()];
        Arrays.fill(ret, '0');
        
        for(int i = num1.length() - 1; i >= 0; i --) {
            int num1Val = num1.charAt(i) - '0';
            for(int j = num2.length() - 1; j >= 0; j --) {
                int num2Val = num2.charAt(j) - '0';
                int sum = (ret[i + j + 1] - '0') + num1Val * num2Val;
                ret[i + j + 1] = (char)(sum % 10 + '0');
                ret[i + j] += sum / 10;
            }
        }
        
        for(int i = 0; i < ret.length; i ++) {
            if(ret[i] != '0' || i == ret.length - 1) {
                return new String(ret, i, ret.length - i);
            }
        }
        
        return "0";
    }
}
结果

在这里插入图片描述

Dev C++调试程序方法详解 阅读详情

相关推荐

PCIe Crosslink

PCIe Crosslink(交叉连接)是一种特殊的PCIe链路连接方式,允许两个PCIe设备(通常是Root Complex或Endpoint)是指两个PCIe设备(如两个CPU、两个FPGA或两个GPU)通过PCIe链路直接连接,形成点对点(P2P)通信通道。:两个Intel/AMD CPU通过PCIe Crosslink直接通信(替代UPI/Infinity Fabric)。:主板需提供PCIe Crosslink连接(如特定插槽支持x16/x8 Crosslink)。

zly8865372的博客 1636

leetcode43. 字符串相乘

给定两个以字符串形式表示的非负整数num1和num2,返回num1和num2的乘积,它们的乘积也表示为字符串形式。 示例:  输入:num1 = “12”,num2 = “34”  输出:“408” 说明: num1和num2的长度小于110。 num1和num2只包含数字0~9。 num1和num2均不以零开头,除非是数字0本身。 不能使用任何标准库的大整数类型(比如BigInteger)或直接将输入转换为整数来处理。 思路: 代码如下: ...

2021dragon的博客 2307

GD32F303调试小记(一)之USART(接收中断、接收空闲中断+DMA、发送DMA)

前言 之前写了GD32F103调试小记(二)之USART(接收中断、接收空闲中断+DMA、发送DMA)一文。这次我们来看看GD32F303的USART是如何配置的,结合这两篇文章,相信大家GD32的USART配置流程会十分熟悉。 DMA 能大大减轻CPU负荷的东西,建议场景合适的情况下,都去用DMA功能。 USART 一种串行通信协议, ...

欢喜6666的博客 3万+

leetcode:字符串相乘(两种方法)

字符串相乘

weixin_73142957的博客 1198

嵌入式设备的switch 以及PHY 芯片调试和选型 (1)

越来越的设备需要多网口的需求,于是需求搭配一个交换机实现网口的扩展。但是很多软件或是硬件工程师在实际选型和应用中经常会遇到一些问题。这里总结一下,避免大家采坑。 几个概念: MAC(介质访问控制),可以理解成数据链路层即可 PHY(物理性),简单理解层转成物理层的连接组件即可 控制接口(MDC/DMIO,I2C,...

睿峰的博客 1万+

vCenter Server出现no healthy upstream的解决方法

可以通过"VMware vCenter Server Management(服务)"来排查问题,在网页里面找到“服务”模块,会发现有很多服务没有启动起来,而且手动启动也无法启动。7.0 地址后,页面出现“no healthy upstream”,无法正常登录vCenter,重启后依旧如此,该故障的前提是没有对vCenter做过任何配置,如下图所示。于是用命令查询是否有证书过期,发现真有多个服务依赖的证书在当天早上过期。使用如下命令尝试打开服务发现不分服务可以打开,不分服务无法打开。

1万+

Leetcode第43题(字符串相乘)

Leetcode第43题(字符串相乘)

ShiXiAoLaNga的博客 659

小梅哥Xilinx ZYNQ学习笔记2——38译码器

译码器(Decoder)是一种多输入多输出的组合逻辑电路,负责将二进制代码翻译为特定的对象(如逻辑电平等),功能与编码器相反。译码器一般分为通用译码器和数字显示译码器两大类。本设计的是通用译码器。三八译码器,即是 3 种输入状态翻译成 8 种输出状态。1.case开始开始,endcase结束;2.数字声明时,合法的基数格式有 4 中,包括:十进制('d 或 'D),十六进制('h 或 'H),二进制('b 或 'B),八进制('o 或 'O)。数值可指明位宽,也可不指明位宽。

m0_51430584的博客 1636

leetcode——字符串相乘

题目:给定两个以字符串形式表示的非负整数num1和num2,返回num1和num2的乘积,它们的乘积也表示为字符串形式。 示例: 输入: num1 = "2", num2 = "3" 输出: "6" 方案一: class Solution { private: // 字符 乘 字符串 string charMultiStr(string num, char c) { if (c == '1') { return num; } else if (c =...

zaishaoyi的专栏 601

【制作100个Unity游戏之36】用unity从零开始实现类《开心消消乐》的三消类消除解压小游戏

Unity甜品消除游戏开发摘要 本文介绍了使用Unity开发甜品消除游戏的核心实现步骤: 冰块阵列生成 通过GlobalDef定义全局参数(9行7列网格) IceSpawner脚本动态生成网格化冰块阵列 添加Resolution脚本实现多分辨率适配 随机水果生成 创建FruitSpawner作为水果容器 FruitItem脚本管理水果属性(行列索引、类型) 支持动态创建水果精灵并设置位置 关键技术点 使用Instantiate动态生成预制体 通过localPosition精确控制网格布局 分辨率适配算法保持

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1291

【原理图PCB专题】Cadence17.4 PCB位号重排与反标

Cadence17.4 PCB位号重排与反标比Cadence16版本更简单一些,那到底如何操作?

一点硬件 1181

LeetCode 43.字符串相乘

给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。

JarlenJohn 634

【代码版本管理】SVN(Subversion)

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!本文先对SVN(Subversion)代码版本管理做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容。

qq_35635374的博客 668

LeetCode 力扣 43. 字符串相乘

题目描述(中等难度) 就是两个数相乘,输出结果,只不过数字很大很大,都是用 String 存储的。也就是传说中的大数相乘。 解法一 我们就模仿我们在纸上做乘法的过程写出一个算法。 个位乘个位,得出一个数,然后个位乘十位,全部乘完以后,就再用十位乘以各个位。然后百位乘以各个位,最后将每次得出的数相加。十位的结果要补 1 个 0 ,百位的结果要补两个 0 。相加的话我们可以直接用之前的大数相加。直...

wind_liang的博客 1157

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

力扣LeetCode #43 字符串相乘(Multiply)

- 题目描述 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。 说明: num1 和 num2 的长度小于110。 num1 和 num2 只包含数字 0-9。 num1 和 num2 均不以零开头,除非是数字 0 本身。 不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。 来源:LeetCode - 示例 示例 1: 输入: num1 = “2”, num2 = “3” 输出: “6

weixin_49155948的博客 310

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

力扣(LeetCode) ——43.字符串相乘(C++)

给定两个非负整数字符串num1和num2,要求返回其乘积字符串。双重循环逐位计算乘积并处理进位、去除前导零等。最终代码展示了完整的C++实现过程,通过模拟竖式乘法的方式,将每位乘积结果存入数组并处理进位问题,最后将中间结果转换为字符串输出。

专注 C++ 后端开发与 Linux 系统编程,深耕 STL 原理、多线程、内存管理、网络编程与服务端开发。用通俗语言拆解晦涩知识点,持续输出高质量学习笔记、踩坑复盘与面试干货。 622

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

大整数相乘 leetcode 43. 字符串相乘

题目描述 有两个用字符串表示的非常大的大整数,算出他们的乘积,也是用字符串表示。不能用系统自带的大整数类型。 输入描述: 空格分隔的两个字符串,代表输入的两个大整数 输出描述: 输入的乘积,用字符串表示 示例1 输入 72106547548473106236 982161082972751393 输出 70820244829634538040848656466105986748 思路 方法来源:...

Hunter的博客 812

Leetcode_43. 字符串相乘

本文介绍了LeetCode字符串相乘问题的两种解法:暴力解法和模拟乘法。暴力解法因数据量大会超出整型范围而被否定。重点讲解了模拟乘法解法,通过逐位相乘并处理进位,使用反向迭代器从个位开始计算,最后通过字符串相加实现竖式乘法。文中提供了完整的C++代码实现,包括字符串相加辅助函数和主乘法函数,解决了大数相乘问题。

心动的那一刻,记忆便盛开了花 1156

LeetCode 43字符串相乘

LeetCode 43字符串相乘 题目简述:给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。 输入:num1 = “2”, num2 = “3” 输出:“6” 输入:num1 = “123”, num2 = “456” 输出:“56088” 说明 num1 和 num2 的长度小于 110。 num1 和 num2 只包含数字 0-9。 num1 和 num2 均不以零开头,除非是数字 0

XBlog 243

Leetcode 43. 字符串相乘

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 均不以零开头,除非是数字

EIUC_Thread的博客 219

leetcode 43 字符串相乘

本题实际上是考察,我们可以来求解问题,但是我们无需完全按照列竖式计算的流程(先进位再求和)进行模拟,我们可以,以示例2为例:左图为一般列竖式计算的流程(先进位再求和),右图为先求和再进位的流程,观察可知,二者计算结果相同,均正确。

2301_80296866的博客 715

Leetcode 43. Multiply Strings 字符串相乘

Leetcode 43. Multiply Strings 字符串相乘 标签: Leetcode 题目地址: https://leetcode-cn.com/problems/multiply-strings/ 题目描述 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘...

CoderWangSon 326

LeetCode 43. 字符串相乘

LeetCode 43. 字符串相乘 题目 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。 示例 1: 输入: num1 = “2”, num2 = “3” 输出: “6” 示例 2: 输入: num1 = “123”, num2 = “456” 输出: “56088” 说明: num1 和 num2 的长度小于11...

Ailecccc的博客 172

LeetCode 力扣 43. 字符串相乘 multiply-strings

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 本身。

motongxue的博客 354

力扣第43题“字符串相乘”

给定两个表示非负整数的字符串num1和num2,计算它们的乘积并以字符串形式返回。

weixin_48941116的博客 458

Leetcode 43. 字符串相乘 C++

Leetcode 43. 字符串相乘 题目 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。 测试样例 1. 输入: num1 = "2", num2 = "3" 输出: "6" 2. 输入: num1 = "123", num2 = "456" 输出: "56088" 说明 1.num1 和 num2 的长度小于110。 2.num1 和 num2 只包含数字 0-9。 3.num1 和 num2 均不以零开头,除非是数字

weixin_43750513的博客 279
上一篇: Leetcode 38. 报数
下一篇: Leetcode 44. 通配符匹配
一纸浮萍
博客等级 码龄9年 11粉丝 103原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值