LeetCode43. 字符串相乘(大数相乘)

2024-04-28 20:18

本文主要是介绍LeetCode43. 字符串相乘(大数相乘),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/multiply-strings

乘法计算

首先我们得先了解一下竖式的计算过程:

​ 我们应该从后往前计算,一个数的第i位乘上另一个数的第j位,就应加在积的第i+j-1位上,“过了10 ”则要向上面进位就行了,该数只需保留该数mod10后的一位数字,如:

在这里插入图片描述

​ 如上图中的738是由数字123乘以数字456 的最后一位数6得来,3 * 6 = 18,所以保留8,进位1;2 * 6 = 12,加上前一位的进位1,最终等于13,所以应该保留3,进位1; 最后的1 * 6 = 6,加上上一位的进位1后,最终等于7,座椅最终结果为738。其他位上的数也是进行一样的计算,最后相同位数上的数字相加得出最终的结果。

​ 由上图可以看到,123 * 6 的结果 738 的最后一位应与 6 对其,123 * 5 的结果 615 的最后一位应与 5 对齐,同理 492 的最后一位应与 4 对齐,下面代码中使用变量 ind 来记录当前数字对齐的位数。

代码实现

/*** @param {string} num1* @param {string} num2* @return {string}*/
var multiply = function(num1, num2) {//其中一个数字为零时,乘积为0,直接返回0if(num1 == '0' || num2 == '0') return '0';var res = [],   // res->保存结果flag = 0,	//flag->保存进位ind = 0;	//ind->当前数字对齐的位数//遍历第一个数的每一位for(let i = num1.length - 1; i >= 0; i--){//遍历第二个数的每一位for(let j = num2.length - 1; j >= 0; j--){//保存计算结果let temp = parseInt(num1[i]) * parseInt(num2[j]) + flag;//注意加上flag(进位)flag = Math.floor(temp / 10);//更新进位数//如果当前计算位置大于res的长度,直接将结果push(接到最后一位),注意应该mod 10//因为乘法是倒序计算的,所以位置应该为 num2.length - 1 - j + indif((num2.length - 1 - j + ind) >= res.length) res.push(parseInt(temp) % 10);else{//计算结果应该加上该位置上的数if((res[num2.length - 1 - j + ind] + (parseInt(temp) % 10)) > 9) flag++;res[num2.length - 1 - j + ind] = (res[num2.length - 1 - j + ind] + (parseInt(temp) % 10)) % 10;}}if(flag) res[ind + num2.length] = flag;flag = 0;//更新初始位ind++;}//reverse()将列表反置,join('')将列表转换成字符串return res.reverse().join('');
};

这篇关于LeetCode43. 字符串相乘(大数相乘)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/944158

相关文章

python中字符串拼接的几种方法及优缺点对比详解

《python中字符串拼接的几种方法及优缺点对比详解》在Python中,字符串拼接是常见的操作,Python提供了多种方法来拼接字符串,每种方法有其优缺点和适用场景,以下是几种常见的字符串拼接方法,需... 目录1. 使用 + 运算符示例:优缺点:2. 使用&nbsjsp;join() 方法示例:优缺点:3

java字符串数字补齐位数详解

《java字符串数字补齐位数详解》:本文主要介绍java字符串数字补齐位数,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java字符串数字补齐位数一、使用String.format()方法二、Apache Commons Lang库方法三、Java 11+的St

C++字符串提取和分割的多种方法

《C++字符串提取和分割的多种方法》在C++编程中,字符串处理是一个常见的任务,尤其是在需要从字符串中提取特定数据时,本文将详细探讨如何使用C++标准库中的工具来提取和分割字符串,并分析不同方法的适用... 目录1. 字符串提取的基本方法1.1 使用 std::istringstream 和 >> 操作符示

C语言字符函数和字符串函数示例详解

《C语言字符函数和字符串函数示例详解》本文详细介绍了C语言中字符分类函数、字符转换函数及字符串操作函数的使用方法,并通过示例代码展示了如何实现这些功能,通过这些内容,读者可以深入理解并掌握C语言中的字... 目录一、字符分类函数二、字符转换函数三、strlen的使用和模拟实现3.1strlen函数3.2st

Java反转字符串的五种方法总结

《Java反转字符串的五种方法总结》:本文主要介绍五种在Java中反转字符串的方法,包括使用StringBuilder的reverse()方法、字符数组、自定义StringBuilder方法、直接... 目录前言方法一:使用StringBuilder的reverse()方法方法二:使用字符数组方法三:使用自

Golang中拼接字符串的6种方式性能对比

《Golang中拼接字符串的6种方式性能对比》golang的string类型是不可修改的,对于拼接字符串来说,本质上还是创建一个新的对象将数据放进去,主要有6种拼接方式,下面小编就来为大家详细讲讲吧... 目录拼接方式介绍性能对比测试代码测试结果源码分析golang的string类型是不可修改的,对于拼接字

Java对象和JSON字符串之间的转换方法(全网最清晰)

《Java对象和JSON字符串之间的转换方法(全网最清晰)》:本文主要介绍如何在Java中使用Jackson库将对象转换为JSON字符串,并提供了一个简单的工具类示例,该工具类支持基本的转换功能,... 目录前言1. 引入 Jackson 依赖2. 创建 jsON 工具类3. 使用示例转换 Java 对象为

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui