当前位置: 首页 > news >正文

43. 字符串相乘

目录

题目链接:

题目:

解题思路:

代码:

总结:


题目链接:

43. 字符串相乘 - 力扣(LeetCode)

题目:

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

注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。

示例 1:
输入:num1 = "2", num2 = "3"
输出:"6"

示例 2:
输入:num1 = "123", num2 = "456"
输出:"56088"

提示:

  • 1 <= num1.length, num2.length <= 200
  • num1 和 num2 只能由数字组成。
  • num1 和 num2 都不包含任何前导零,除了数字 0 本身。

解题思路:

使用一个int数组存储,然后俩for遍历即可相乘,使用StringBuilder进行优化效率

代码:

class Solution {public String multiply(String num1, String num2) {if(num1.equals("0")||num2.equals("0")){return "0";}int sum=0;int[] arr=new int[num1.length()+num2.length()];for(int i=num2.length()-1;i>=0;i--){int n2=num2.charAt(i)-'0';for(int j=num1.length()-1;j>=0;j--){int n1=num1.charAt(j)-'0';sum=arr[i+j+1]+n1*n2;arr[i+j+1]=sum%10;arr[i+j]+=sum/10;}}StringBuilder sc=new StringBuilder();for(int i=0;i<arr.length;i++){if(i==0&&arr[i]==0) continue ;sc.append(arr[i]);}return sc.toString();}
}

最后,我们将结果数组转换为字符串:

使用 StringBuilder 来高效拼接字符串
跳过结果开头可能存在的 0(例如,当结果实际长度小于最大可能长度时)
最后将 StringBuilder 转换为 String 并返回
算法示例演示
让我们以示例 2(num1 = "123", num2 = "456")来演示算法的执行过程:

初始状态:arr = [0, 0, 0, 0, 0, 0](长度为 3+3=6)

第一轮:i=2(num2 的第 3 位,即 '6')

j=2(num1 的第 3 位,即 '3'):3×6=18
sum = 0 + 18 = 18
arr[5] = 18%10 = 8
arr[4] += 18/10 = 1 → arr[4] = 1
arr = [0, 0, 0, 0, 1, 8]
j=1(num1 的第 2 位,即 '2'):2×6=12
sum = 0 + 12 = 12
arr[4] = 12%10 = 2
arr[3] += 12/10 = 1 → arr[3] = 1
arr = [0, 0, 0, 1, 2, 8]
j=0(num1 的第 1 位,即 '1'):1×6=6
sum = 0 + 6 = 6
arr[3] = 6%10 = 6
arr [2] += 6/10 = 0 → 不变
arr = [0, 0, 0, 6, 2, 8]

第二轮:i=1(num2 的第 2 位,即 '5')

j=2(num1 的第 3 位,即 '3'):3×5=15
sum = 0 + 15 = 15
arr[4] = 15%10 = 5
arr[3] += 15/10 = 1 → arr[3] = 6+1=7
arr = [0, 0, 0, 7, 5, 8]
j=1(num1 的第 2 位,即 '2'):2×5=10
sum = 0 + 10 = 10
arr[3] = 10%10 = 0
arr[2] += 10/10 = 1 → arr[2] = 1
arr = [0, 0, 1, 0, 5, 8]
j=0(num1 的第 1 位,即 '1'):1×5=5
sum = 0 + 5 = 5
arr[2] = 5%10 = 5
arr [1] += 5/10 = 0 → 不变
arr = [0, 0, 1+0=1? 不,正确计算应为:
sum = arr [2] + 5 = 1 + 5 = 6
arr [2] = 6%10 = 6
arr [1] += 6/10 = 0
所以 arr = [0, 0, 6, 0, 5, 8]

第三轮:i=0(num2 的第 1 位,即 '4')

j=2(num1 的第 3 位,即 '3'):3×4=12
sum = arr[3] + 12 = 0 + 12 = 12
arr[3] = 12%10 = 2
arr[2] += 12/10 = 1 → arr[2] = 6+1=7
arr = [0, 0, 7, 2, 5, 8]
j=1(num1 的第 2 位,即 '2'):2×4=8
sum = arr[2] + 8 = 7 + 8 = 15
arr[2] = 15%10 = 5
arr[1] += 15/10 = 1 → arr[1] = 1
arr = [0, 1, 5, 2, 5, 8]
j=0(num1 的第 1 位,即 '1'):1×4=4
sum = arr[1] + 4 = 1 + 4 = 5
arr[1] = 5%10 = 5
arr [0] += 5/10 = 0 → 不变
arr = [0, 5, 5, 2, 5, 8]

最终数组为 [0, 5, 6, 0, 8, 8](注:上述步骤可能简化了部分计算,实际结果应为该数组)

转换为字符串时,跳过开头的 0,得到 "56088",这与示例 2 的预期输出一致。
算法复杂度分析
时间复杂度
算法包含两层嵌套循环,外层循环次数为 num2 的长度 n,内层循环次数为 num1 的长度 m
因此时间复杂度为 O (m×n)
对于长度均为 200 的输入,这意味着最多需要 200×200=40,000 次运算,效率非常高
空间复杂度
我们使用了一个长度为 m+n 的数组来存储中间结果
因此空间复杂度为 O (m+n)
算法优势与适用场景
这个字符串相乘算法的主要优势在于:

处理大数能力:能够处理远超原生整数类型表示范围的大整数相乘
高效性:时间复杂度为 O (m×n),是这类问题的最优解法之一
简洁性:代码实现简洁明了,易于理解和维护
低空间消耗:仅使用一个数组存储中间结果,空间效率高

适用场景包括:

需要处理大整数运算的科学计算
密码学中的大数运算
金融系统中高精度的数值计算
任何需要处理超过原生整数类型范围的乘法运算场景
可能的优化方向
虽然这个算法已经非常高效,但在实际应用中还可以考虑以下优化:

提前判断结果长度:可以通过判断最高位是否为 0 来提前确定结果的实际长度
处理前导零:如果输入可能包含前导零(虽然题目中说不会),可以先预处理去除
针对特殊情况优化:例如其中一个数是 1 或 10 的倍数时,可以直接返回另一个数或左移相应位数
总结
本文详细解析了一个高效的字符串相乘算法,该算法通过模拟手工乘法的过程,实现了不依赖内置大数处理库的大整数相乘功能。算法的核心思想是使用一个数组存储每一位的计算结果,通过嵌套循环实现逐位相乘,并处理相应的进位。

这个算法的时间复杂度为 O (m×n),空间复杂度为 O (m+n),对于处理长达 200 位的大整数相乘非常高效。理解这个算法不仅能帮助我们解决类似的编程问题,还能加深对乘法运算本质的理解。

在实际开发中,当遇到需要处理超出原生整数类型范围的数值计算时,这种模拟手工计算的思路是一种非常有效的解决方案。
 

总结:

本文介绍了字符串形式大整数相乘的算法。通过模拟手工乘法过程,使用数组逐位计算并处理进位,避免了直接转换为整数。算法时间复杂度O(m×n),空间复杂度O(m+n),适用于处理超长数字相乘。关键步骤包括:初始化结果数组、双重循环逐位相乘计算、处理进位、去除前导零。该方案高效处理了200位大数相乘问题,适用于需要高精度计算的场景,且不依赖内置大数库。


文章转载自:

http://mNsBgAHU.bchhr.cn
http://iPz6nwVt.bchhr.cn
http://D2r5uK9E.bchhr.cn
http://ExlHQU3z.bchhr.cn
http://NrQWGweY.bchhr.cn
http://0w3dKRDs.bchhr.cn
http://fDmA4XPS.bchhr.cn
http://8VEERjc5.bchhr.cn
http://iuiD4B0d.bchhr.cn
http://Jsxs9It5.bchhr.cn
http://3o6zQpa7.bchhr.cn
http://YOFA6lMZ.bchhr.cn
http://BmEvmU2d.bchhr.cn
http://MR7v5jmR.bchhr.cn
http://HAovascE.bchhr.cn
http://FWBXhskc.bchhr.cn
http://hMRlZwpd.bchhr.cn
http://t2i0K5dY.bchhr.cn
http://VkjLgMhS.bchhr.cn
http://4pVmpZ6m.bchhr.cn
http://SR8R5qIh.bchhr.cn
http://kPtuC7c5.bchhr.cn
http://eGWBRTjN.bchhr.cn
http://wAmwSUZV.bchhr.cn
http://9cGPbD3R.bchhr.cn
http://sh0BqeYK.bchhr.cn
http://RPayO9dt.bchhr.cn
http://XUPqofVe.bchhr.cn
http://gM7bm0Et.bchhr.cn
http://WZ0VUSWw.bchhr.cn
http://www.dtcms.com/a/371784.html

相关文章:

  • 【论文阅读】解耦大脑与计算机视觉模型趋同的因素
  • 20250907 线性DP总结
  • 实战演练:通过API获取商品详情并展示
  • 新建Jakarta EE项目,Maven Archetype 选项无法加载出内容该怎么办?
  • 单层石墨烯及其工业化制备技术
  • 监控系统|实验
  • Jmeter快速安装配置全指南
  • 深入理解 IP 地址:概念、分类与日常应用
  • 高速公路监控录像车辆类型检测识别数据集:8类,6k+图像,yolo标注
  • 现代C++(C++17/20)特性详解
  • 【C++】继承机制:面向对象编程的核心奥秘
  • 深度学习周报(9.1~9.7)
  • Spring 日志文件
  • 【HARP 第二期】HARP 的数据组织“约定”规范
  • 钾元素:从基础认知到多元应用与前沿探索
  • 如何短时间内精准定位指标异动根源
  • Geogebra 绘制 电磁波反射折射+斯涅尔定律+半波损失
  • Mia for Gmail for Mac 邮件管理软件
  • EXCEL VBA 清空Excel工作表(Sheet)的方法
  • kafka如何保证消息的顺序性
  • Python快速入门专业版(十):字符串特殊操作:去除空格、判断类型与编码转换
  • 【数据分析】微生物组数据的批次校正与分析
  • 技术前瞻:衡石Data Agent在多模态AI与复杂数据源下的扩展与挑战
  • 如何通过 Activepieces 实现智能工作流自动化
  • Knex 和 Schema 是什么?
  • vector类(一)
  • OpenLayers常用控件 -- 章节八:地图动画控件教程
  • 在 CI/CD 管道中集成人工智能 (AI)
  • 开源项目MusicGen技术详解
  • 【面向对象编程——多继承】