43. 字符串相乘

题目

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

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

示例 1:

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

示例 2:

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

提示:

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

 

普通竖式法

思路

第一种方法的主要思路就是模拟我们平时手算的计算过程,其主要步骤如下:

  • 首先我们实现一个可以两个string类型可以相加的子函数。

  • 依次将每一个乘数与被乘数的结果相加就是最终结果。

  • 关键有两点:

    • 如果做string类型的乘法?

      其实我们每次的乘法都是单位数和(单位数或者多位数)相乘,那么我们可以把乘法看作是单位数次(多位数)相加。

    • 如何在乘数与被乘数的结果后面补充合适个数的零?

      乘数倒数第n位与被乘数的结果后面补充n-1个零。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

 

AC代码

class Solution {
public:string multiply(string num1, string num2) {if ("0" == num1 || "0" == num2){return "0";}string ret;int flag = 0;for (int i = num2.size() - 1; i >= 0; i--){string tmp;int count = num2[i] - '0';for (int j = 0; j < count; j++){tmp = StringAdd(tmp, num1);}for (int k = 0; k < flag; k++){tmp.push_back('0');}ret = StringAdd(ret, tmp);flag++;}return ret;}string StringAdd(string a, string b){int i = a.size() - 1;int j = b.size() - 1;string ret;int flag = 0;while (i >= 0 || j >= 0){int num1 = 0;if (i >= 0){num1 = a[i] - '0';i--;}int num2 = 0;if (j >= 0){num2 = b[j] - '0';j--;}int add = num1 + num2 + flag;if (add > 9){flag = 1;add -= 10;}else{flag = 0;}ret.push_back('0' + add);}      if (1 == flag){ret.push_back('1');}reverse(ret.begin(), ret.end());return ret;}    
};

 

优化竖式法

思路

如果我们先不进位,最后一起进位的话就可以用一个整形数组暂时保存计算结果

  • 这个数组应该开辟多大的空间?

    如果m = num1.size() n = num2.size()

    假设num1长度是1,num2长度是1,那么最小长度为1,即为m+n-1;最大长度为2,即为m+n。

  • 如何在数组合适的位置加上计算结果?

    通过观察不难发现,被乘数的下标为i,乘数的下标为j,它们相乘的结果应该放在数组下标为i+j+1的位置。

在这里插入图片描述

在这里插入图片描述

 

AC代码

class Solution {
public:string multiply(string num1, string num2) {if ("0" == num1 || "0" == num2){return "0";}int sz_1 = num1.size();int sz_2 = num2.size();string ret;vector<int> v(sz_1+sz_2, 0);for (int i = num2.size() - 1; i >= 0; i--){int x2 = num2[i] - '0';for (int j = num1.size() - 1; j >= 0; j--){int x1 = num1[j] - '0';v[i+j+1] += x1 * x2;}}int flag = 0;for (int i = sz_1 + sz_2 - 1; i >= 0; i--){v[i] += flag;flag = v[i] / 10;v[i] %= 10;}if (v[0] != 0){ret.push_back('0' + v[0]);}for (int i = 1; i < sz_1 + sz_2; i++){ret.push_back('0' + v[i]);}return ret;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/707366.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python:functools.partial和functools.wraps使用

python&#xff1a;functools.partial和functools.wraps使用 1 前言 python内置的functools模块&#xff0c;提供了一些非常好用的类或者方法&#xff0c;其中functools.partial和functools.wraps的使用频率较高&#xff0c;本文将针对其分析使用。 2 使用 2.1 functools.p…

好易点 | 上海厨卫展首秀人气爆棚,智能阳台备受瞩目

2024年5月14日&#xff0c;第28届中国国际厨房、卫浴设施展览会&#xff08;简称&#xff1a;上海厨卫展&#xff09;在上海盛大开幕。作为厨卫行业的年度盛事&#xff0c;本次展会不仅汇聚了众多国内外知名品牌&#xff0c;更成为了展示前沿五金厨卫臻品的重要平台。其中&…

k8s 二进制安装 详细安装步骤

目录 一 实验环境 二 操作系统初始化配置&#xff08;所有机器&#xff09; 1&#xff0c;关闭防火墙 2&#xff0c;关闭selinux 3&#xff0c;关闭swap 4, 根据规划设置主机名 5, 做域名映射 6&#xff0c;调整内核参数 7&#xff0c; 时间同步 三 部署 dock…

图数据库原理在构建实体血缘关系图中的应用与实践

在当今复杂的数据驱动型应用中&#xff0c;理解和管理实体间的复杂关系变得日益重要。通过低代码平台进行配置的应用&#xff0c;因采用了DSL语言进行统一设计&#xff0c;要让专业开发者和非专业开发者都能快速实现复杂应用的构建&#xff0c;实体之间的数据逻辑和关系梳理就尤…

PyQt5 中的 List View

文章目录 1. 基础概念2. 创建 List View2.1 PyQt5 中一个简单的 List View 实例2.2 代码解释2.3 运行结果 3. 数据模型3.1 标准模型3.2 自定义模型 4. 自定义 List View4.1 使用样式表 (QSS)4.2 设置项委托 (Item Delegate) 5.事件处理6. 与数据交互6.1 添加数据6.2 删除数据6.…

【JAVA入门】Day05 - 面向对象

【JAVA入门】Day05 - 面向对象 文章目录 【JAVA入门】Day05 - 面向对象一、对象的设计和使用1.1 类和对象1.2 类的分类 二、封装三、private 关键字四、this 关键字五、构造方法六、JavaBean七、对象的内存图7.1 一个对象的内存图7.2 两个对象的内存图7.3 两个引用指向同一个对…

后仿真中的关于延时问题(如何指定延时模式)

了解到这里,大家可能会有个疑问:据我们常见,一个模块中不仅包含specify块,还会包含大量的门单元等语句。我们通常在specify块中会指定模块路径延迟, 模块内的路径单元(基本的门级单元、开关级元件或者子模块)又存在分布延迟,。 模块中这两种延迟经常会共存,那么此时进行仿真…

Cadence 16.6 PCB Edito如何将鼠标中键反向拉拽改为正向拖拽

Cadence 16.6 PCB Editor如何将鼠标中键反向拉拽改为正向拖拽 Cadence 16.6 PCB Editor默认鼠标中键是反向的拉拽&#xff0c;让我很不适应&#xff0c;在网上找的可行的方法&#xff0c;在这里总结出来&#xff0c;希望能帮到其他工程师。 按照以下步骤进行操作&#xff1a; …

TypeScript基础知识:TypeScript是什么?为什么会出现TypeScript?TypeScript相较于javascript有那些优势?

TypeScript(简称:TS)是JavaScript的超集(JS有的TS 都有)。 图解就是&#xff1a; TypeScriptType javaScript(在JS 基础之上&#xff0c;为JS 添加了类型支持)。 TypeScript 是微软开发的开源编程语言&#xff0c;可以在任何运行JavaScript的地方运行。 那么为什么要出现type…

LLMjacking:针对云托管AI大模型服务的新型攻击

Sysdig威胁研究团队(TRT)观察到一种新型攻击&#xff0c;命名为LLMjacking。它利用窃取的云凭证&#xff0c;对托管在云上的十个大型语言模型(LLM)服务发起攻击。 这些凭证是从一个流行的目标获得&#xff0c;即运行着一个存在漏洞的Laravel版本&#xff08;CVE-2021-3129&…

Media Encoder 2024 for Mac:专业的音视频编码神器

Media Encoder 2024 for Mac&#xff0c;作为Mac用户的专业音视频编码工具&#xff0c;凭借其强大的功能和用户友好的界面&#xff0c;深受专业人士的喜爱。它支持将各种格式的音视频素材转换为多种流行格式&#xff0c;如MP4、MOV、AVI等&#xff0c;满足不同的播放和发布需求…

C# WinForm —— 16 MonthCalendar 介绍

1. 简介 可以选择单个日期&#xff0c;也可以选择一段日期&#xff0c;在选择时间范围上 比较适用&#xff0c;但不能跨月份选择日期范围 在直观上&#xff0c;可以快速查看、选择日期/日期范围 2. 常用属性 属性解释(Name)控件ID&#xff0c;在代码里引用的时候会用到,一般…