如何高效解决“字符串相乘“问题?

🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨
>🐻推荐专栏1: 🍔🍟🌯C语言初阶
🐻推荐专栏2: 🍔🍟🌯C语言进阶
🔑个人信条: 🌵知行合一
金句分享:
✨你要狠下心来去努力,努力变成一个很厉害的人.✨

前言

本题牛牛写了很久,起初对每次相乘的结果就进位处理了,最后还需要考虑错位相加,进行补0等,花了半天也没搞出来.
所幸学到了一种高效且相对简单的方法解决此题,希望对友友们有所帮助.
在这里插入图片描述

目录

  • 前言
  • 一、字符串相乘
    • 题目介绍
    • 思路分析
    • 代码实现:

一、字符串相乘

题目介绍

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

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

示例1:

输入: num1 = “2”, num2 = “3”
输出: “6”

示例2:

输入: num1 = “123”, num2 = “456”
输出: “56088”

思路分析

在这里插入图片描述

  1. 同时从两个字符串的右边开始往前遍历相乘.

  2. num2中的每一个字符依次与与num1中的每个字符想乘.

  3. 将相乘的结果保存在一个arr数组中,每个相乘的结果放入正确的位置(i+J+1).
    在这里插入图片描述

  4. arr数组创建多大的空间?
    一个最小的二位数 × 一个最小的三位数 结果是一个四位数
    10100=1000
    一个最大的二位数 × 一个最大的三位数 结果是一个五位数
    99
    999=98901
    综上呢,两个数相乘,他们的结果的位数是[length1 + length2,length1 + length2+1],(0除外哈)
    最高位可能有数据,也可能没有数据.

  5. 为什么正确的位置是i+j+1?
    试着看上图分析:注意ij都是从右边往左边遍历.
    此处是此解法的难点,通过将每次相乘后的结果放入正确的位置以实现错位相加.
    牛牛的理解是:
    j是内循环,从右往左遍历num1,i是外循环,决定的是num2.
    所以用j的变化控制与num1相乘结果的位置,用i的变化,控制错位相加(即相乘的结果要往左移动一位)即num2的位变化.

  6. 对错位相加后的数组进行进位处理:从右往左进位
    (1)先保存元素的值,tmp = arr[i]+carry;
    (2)替换为进位后的数据: arr[i] = (arr[i] + carry) % 10;
    (3)保存进位数: carry = tmp / 10;

  7. 将进位后的数组中的数据依次尾插入amass对象中.
    注意:先判断第一个位置有没有有效数据(即最高位是否有效)

  8. 最后,处理特殊情况,如果num1和num2中有一个是0,则直接返回0.

代码实现:

class Solution {
public:string multiply(string num1, string num2) {//处理特殊情况,如果有一方为0,if (num1[0] == '0' || num2[0] == '0') return string("0");int length1 = num1.size();int length2 = num2.size();int arr[length1 + length2];//将数组中的元素全部初始化为0for (auto& a : arr){a = 0;}string amass;//相乘//内外层循环控制num2和num1 的次序无所谓//版本1for (int i = length2 -1; i >= 0; i--){//外层循环控制num2int s1 = num2[i] - '0';for (int j = length1 - 1; j >= 0; j--){//内存循环控制num1int s2 = num1[j] - '0';arr[i+j+1] += s1 * s2;//注意这里是+=}}//版本2/*for (int i = length1 - 1; i >= 0; i--){int s1 = num1[i] - '0';for (int j = length2 - 1; j >= 0; j--){int s2 = num2[j] - '0';arr[i + j + 1] += s1 * s2;//注意这里是+=}}*///处理进位问题:int carry = 0;for (int i = length1 + length2 - 1; i >= 0; i--){int tmp = arr[i]+carry;				//保存当前位置中的元素大小,因为下一句代码会影响giabarr[j]arr[i] = (arr[i] + carry) % 10;       //存放个位数carry = tmp / 10;          			 //存放十位数(进位数}//第一个位置是否有元素,最高位是否有效if (arr[0] != 0)amass.push_back(arr[0] + '0');//for (int i = 1; i < length1 + length2; i++){amass.push_back(arr[i] + '0');}return amass;}
};

最后,感谢友友们阅读本篇解题分享,希望这篇文章对您在解决问题过程中有所帮助。在解题过程中,我们需要不断思考、尝试、调整,才能得出正确的解决方案。同时,我们也要记得不断学习、积累知识和经验,提升自己的能力。最后,祝您在解决问题的道路上越走越远,不断成长和进步。
在这里插入图片描述

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

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

相关文章

MariaDB 10.11.4 安装教程(zip格式,Windows环境)

前言 MariaDB 10.11.4 这个版本是目前最新的长期支持版&#xff0c;下面来安装下 下载 官网&#xff1a;MariaDB 10.11.4 打开上面链接&#xff0c;点Download 安装 解压缩下载的 zip 文件&#xff0c;到 bin 目录&#xff0c;管理员运行cmd&#xff0c;执行如下命令 mys…

UNET 架构综合指南 | 掌握图像分割--附源码

介绍 在令人兴奋的计算机视觉主题中,图像包含许多秘密和信息,区分和突出显示项目至关重要。图像分割是将图像分割成有意义的区域或对象的过程,在从医学成像到自动驾驶和对象识别等各种应用中至关重要。准确和自动的分割长期以来一直面临挑战,传统方法经常在准确性和效率方…

笔记本电脑如何把sd卡数据恢复

在使用笔记本电脑过程中&#xff0c;如果不小心将SD卡里面的重要数据弄丢怎么办呢&#xff1f;别着急&#xff0c;本文将向您介绍SD卡数据丢失常见原因和恢复方法。 ▌一、SD卡数据丢失常见原因 - 意外删除&#xff1a;误操作或不小心将文件或文件夹删除。 - 误格式化&#…

Java分布式微服务3——Docker

文章目录 Docker介绍安装DockerDocker基础操作Docker服务的启动镜像命令容器命令1. 从docker hub去查看Nginx容器的运行命令2. 查看所有容器状态3. 查看容器日志4. 进入Nginx容器执行命令&#xff0c;修改Html内容&#xff0c;添加“Hello World”5. 停止与开始容器6. 删除容器…

如何使用PHP Smarty插件和自定义函数?

这是一个非常酷的插件&#xff0c;它可以让你的PHP代码变得更加聪明、灵活和有趣。不过&#xff0c;别担心&#xff0c;我会用幽默的方式引导你一步步掌握这个强大的工具。 首先&#xff0c;要开始使用PHP Smarty&#xff0c;你需要确保已经安装了Smarty库。你可以通过在终端中…

【MySQL】InnoDB存储引擎详解

InnoDB引擎是MySQL5.5版本之后默认的存储引擎 逻辑存储结构 首先是表空间Tablespace&#xff08;ibd文件&#xff09;&#xff1a;一个mysql实力可以对应多个表空间&#xff0c;用于存储及记录&#xff0c;索引等数据 这些存储记录&#xff0c;索引等数据中是用段(Segment)来…

RN实现混合式开发-内嵌html

介绍 React Native WebView是一个用于在React Native应用中嵌入Web内容的组件。它允许你在应用中显示网页、加载HTML字符串、运行JavaScript代码等。 使用 首先&#xff0c;你需要在你的React Native项目中安装React Native WebView库。可以使用以下命令进行安装&#xff1a;…

【PDF密码】PDF文件不能打印,为什么?

正常的PDF文件是可以打印的&#xff0c;如果PDF文件打开之后发现文件不能打印&#xff0c;我们需要先查看一下自己的打印机是否能够正常运行&#xff0c;如果打印机是正常的&#xff0c;我们再查看一下&#xff0c;文件中的打印功能按钮是否是灰色的状态。 如果PDF中的大多数功…

【LangChain】Prompts之自定义提示模板

LangChain学习文档 【LangChain】向量存储(Vector stores)【LangChain】向量存储之FAISS【LangChain】Prompts之Prompt templates【LangChain】Prompts之自定义提示模板 概要 假设我们希望LLM生成给定函数名称的英语解释。为了实现此任务&#xff0c;我们将创建一个自定义提示…

AWS——03篇(AWS之Amazon S3(云中可扩展存储)-01入门)

AWS——03篇&#xff08;AWS之Amazon S3&#xff08;云中可扩展存储&#xff09;-01入门&#xff09; 1. 前言2. 关于 Amazon S32.1 介绍2.1.1 简述2.1.2 详细介绍 2.2 Amazon S3 好处和功能2.3 3. 创建S3存储桶3.1 创建存储桶3.2 修改访问权限 4. 简单实用4.1 上传图片文件4.2…

腾讯云服务器上传和下载的方法汇总不止是FTP

腾讯云服务器怎么上传文件&#xff1f;腾讯云服务器如何传输文件呢&#xff1f;可以通过FTP上传文件到云服务器&#xff0c;还有MSTSC、SCP、WinSCP、RDP、MRD等方法上传文件到云服务器&#xff0c;本地操作系统分为Windows、Linux和MAC&#xff0c;腾讯云服务器网分享本地不同…

mobile私有方法

目录 1 mobile私有方法 1.1 //当前商家下所有商品模板ID集合 1.2 //属于当前模板的商品ID集合 1.3 //根据模板设置的包邮地区过滤出当前配送地址所在地址 1.4 //只要有一个符合包邮条件,则退出 mobile私有方法 private static <

iOS 实现图片高斯模糊效果

效果图 用到了 UIVisualEffectView 实现代码 - (UIVisualEffectView *)bgEffectView{if(!_bgEffectView){UIBlurEffect *blur [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];_bgEffectView [[UIVisualEffectView alloc] initWithEffect:blur];}return _bgEffect…

数据结构:栈的实现(C实现)

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》 文章目录 前言一、栈的实现思路1. 结构的定义2. 初始化栈(StackInit)3. 入栈(StackPush)4. 出栈(StackPop)5. 获取栈顶元素(StackTop)6. 检查栈是否为空(StackEmpty)7. 销毁栈(StackDestroy) 二、…

UNIX网络编程卷一 学习笔记 第二十七章 IP选项

IPv4允许在20字节的首部固定部分后跟最多共40字节的选项。尽管已经定义了10种IPv4选项&#xff0c;但最常用的是源路径选项。我们可通过存取IP_OPTIONS套接字选项访问这些选项&#xff0c;我们存取该套接字选项时&#xff0c;所用的缓冲区中的值就是它们置于IP数据报中的格式。…

Linux vi/vim

目录 Linux vi/vim 什么是 vim? vim 键盘图 vi/vim 的使用 命令模式 输入模式

在QT及VS运行包含opencv的cmakelists实例

本文分享如何利用QT和Visual Studio运行cmake组织管理的程序&#xff0c;也就是运行cmakelists.txt。 main和cmakelists内容 main和cmakelists文件路径如下&#xff1a; main.cpp #include<opencv2/opencv.hpp> #include<iostream> #include <string> usi…

Linux:Shell编程之正则表达式

目录 绪论 1、正则表达式 1.1 通配符 1.2 正则表达式分类 1.3 基本正则 1.4 正则表达式中表示次数的表达式 1.5 位置锚定 1.5.1 词首锚定和词尾锚定 1.6 分组&#xff08;&#xff09; 1.7 逻辑或 1.8 扩展正则 绪论 正则表达式&#xff1a;有一类特殊字符以及文本…

Debian安装和使用Elasticsearch 8.9

命令行通过 .deb 包安装 Elasticsearch 创建一个新用户 adduser elastic --> rust # 添加sudo权限 # https://phoenixnap.com/kb/how-to-create-sudo-user-on-ubuntu usermod -aG sudo elastic groups elastic下载Elasticsearch v8.9.0 Debian 包 https://www.elastic.co/…

YOLOv5基础知识入门(3)— 目标检测相关知识点

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。YOLO算法发展历程和YOLOv5核心基础知识学习完成之后&#xff0c;接下来我们就需要学习目标检测相关知识了。为了让大家后面可以顺利地用YOLOv5进行目标检测实战&#xff0c;本节课就带领大家学习一下目标检测的基础知识点&…