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

news2025/2/27 16:31:20

🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨
>🐻推荐专栏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];
        //将数组中的元素全部初始化为0
        for (auto& a : arr)
        {
            a = 0;
        }
        string amass;
        //相乘
        //内外层循环控制num2和num1 的次序无所谓
        //版本1
        for (int i = length2 -1; i >= 0; i--){//外层循环控制num2
            int s1 = num2[i] - '0';
            for (int j = length1 - 1; j >= 0; j--){//内存循环控制num1
                int 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.coloradmin.cn/o/862417.html

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

相关文章

rv1126设置静态ip

开发板配网--------------------------------------------------------------------------------------------- 刚拿到的开发板里面的网络配置大多不可用&#xff0c;此时是无法ping通的&#xff0c;这个时候需要重新修改相关的配置文件&#xff1b; Vi /etc/profile 最后面…

如何将苹果彻底删除视频找回?试试这3种方法

如今是短视频时代&#xff0c;大家通常会使用苹果手机来拍摄视频&#xff0c;以此记录生活中的美好日常。但是大家都知道视频是十分占空间的&#xff0c;这也经常会出现iPhone内存不足&#xff0c;磁盘崩溃的问题。 当遇到iPhone内存不足的情况时&#xff0c;大家往往会选择清…

Failed to execute goal org.apache.maven.plugins

原因&#xff1a; 这个文件D:\java\maven\com\ruoyi\pg-student\maven-metadata-local.xml出了问题 解决&#xff1a; 最简单的直接删除D:\java\maven\com\ruoyi\pg-student\maven-metadata-local.xml重新打包 或者把D:\java\maven\com\ruoyi\pg-student这个目录下所有文件…

【QPSK信号生成】生成正交相移键控信号研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

闪马智能又上榜!

近日&#xff0c;上海市经济和信息化委员会公布了2023年度上半年&#xff08;第30批&#xff09;市级企业技术中心拟认定企业名单。凭借在技术创新方面的突出成就&#xff0c;闪马智能上榜其中。 本次认定由上海市经济和信息化委员会组织开展&#xff0c;综合企业的地位和作用、…

Kubernetes Service 工作原理

本文介绍了 Kubernetes Service 的概念、原理和具体使用。 作者&#xff1a;沈亚军 爱可生研发团队成员&#xff0c;负责公司 DMP 产品的后端开发&#xff0c;爱好太广&#xff0c;三天三夜都说不完&#xff0c;低调低调… 本文来源&#xff1a;原创投稿 爱可生开源社区出品&am…

MAUI+Blazor 如何开启浏览器调试工具

文章目录 前言如何开启调试模式输入快捷键打开浏览器有什么意义&#xff1f; 前言 MAUIBlazor其实就是浏览器套壳&#xff0c;我觉得很有意义&#xff0c;因为现在性能已经不是主要的限制了&#xff0c;很多时候讲究的快速开发。而且MAUIBlazor跨平台的未来感觉实在是太香了。…

基于Gradio的GPT聊天程序

网上很多别人写的&#xff0c;要用账号也不放心。就自己写了一个基于gradio的聊天界面&#xff0c;部署后可以本地运行。 特点&#xff1a; 可以用openai的&#xff0c;也可以用api2d&#xff0c;其他api可以自己测试一下。使用了langchain的库 可以更改模型&#xff0c;会的…

Semantic Kernel 入门系列: Planner 规划器

Semantic Kernel 的一个核心能力就是实现“目标导向”的AI应用。 目标导向 “目标导向”听起来是一个比较高大的词&#xff0c;但是却是实际生活中我们处理问题的基本方法和原则。 顾名思义&#xff0c;这种方法的核心就是先确定目标&#xff0c;然后再寻找实现目标的方法和…

基于R做宏基因组结果的PCoA分析

写在前面 因为公司给的PCA结果效果不佳&#xff0c;决定从中重新挑选部分样本进行再分析 步骤 表格结果预处理 在属水平genus参考原本结果已有的PCA图&#xff0c;尽可能挑选距离较远且聚团的样本 选取不同样本属水平的丰度数据&#xff0c;整理成逗号分隔的csv文件 代码…

Android:自定义沿着曲线轨迹移动

前言 前几天&#xff0c;后台有老铁留言&#xff0c;说有个需求&#xff0c;画两条曲线&#xff0c;中间是一个小球&#xff0c;沿着两条线中间的轨迹从左往右移动&#xff0c;让提供个思路&#xff0c;做为一个极度宠粉的博主&#xff0c;思路不仅要提供&#xff0c;实现方案也…

视图簇 se54 sm34 se54

今天演练了一下 维护视图到视图簇的过程。 se11建表&#xff0c;建表之后 【使用程序】→【表维护生成器】 se54 新建视图簇 对象结构 选中其中一行 字段附属 PS:以上每一行都要设置过去 &#xff0c; 设置完成了 激活 sm34展示

Word转PDF工具哪家安全?推荐好用的文件格式转换工具

Word文档是我们最常见也是最常用的办公软件&#xff0c;想必大家都知道了Word操作起来十分的简单&#xff0c;而且功能也是比较齐全的。随着科技的不断进步&#xff0c;如今也是有越来越多类型的办公文档&#xff0c;PDF就是其中之一&#xff0c;那么word转pdf怎么转?Word转PD…

vue3多页面配置踩坑

vue3实现多页面打包容易&#xff0c;关键是如何实现本地的开发和调试&#xff1f;我们接下来解决如下几个问题&#xff1a; 1 多页面项目的项目结构是怎样的&#xff1f; --public--src---App.vue---main.js---page1. ---App.vue---main.js----home.vue----list.vue---page2.…

申请TikTok海外直播公会的具体流程

截止目前&#xff0c;TikTok的主用户群已经从除中国用户外的亚洲用户群&#xff0c;逐步转变成了以英美欧洲为主体的西方用户群体。TikTok先后在40多个国家的应用商店内排名前列&#xff0c;成为了全球增速最快的短视频APP。接下来的这篇文章就是关于抖音tiktok海外公会申请cmx…

谷器数据:以“数字化+标准化”推动中小企业高质量发展

近日&#xff0c;2023全国专精特新中小企业发展大会在浙江杭州举行。据悉&#xff0c;截至目前&#xff0c;我国已累计培育专精特新“小巨人”企业1.2万余家&#xff0c;专精特新中小企业超9.8万家&#xff0c;创新型中小企业达21.5万家。其中&#xff0c;1.2万家小巨人企业中&…

DETR模型计算量(FLOPs)参数量(Params)

前言 关于计算量(FLOPs)参数量(Params)的一个直观理解&#xff0c;便是计算量对应时间复杂度&#xff0c;参数量对应空间复杂度&#xff0c;即计算量要看网络执行时间的长短&#xff0c;参数量要看占用显存的量。 计算量&#xff1a; FLOPs&#xff0c;FLOP时指浮点运算次数&a…

云端剪切板,让你的数据同步无界

云端剪切板&#xff0c;让你的数据同步无界&#xff01; 每个人都应该保护自己的数据&#xff0c;同时使它易于访问和共享。这就是我们的云剪切板网站诞生的原因&#xff01;无论你在哪里&#xff0c;只要登录我们的网站&#xff0c;就可以随时随地使用你的剪切板数据。 你可…

从支付或退款之回调处理的设计,看一看抽象类的使用场景

一、背景 抽象类&#xff0c;包含抽象方法和实例方法&#xff0c;抽象方法待继承类去实例化&#xff0c;正是利用该特性&#xff0c;以满足不同支付渠道的差异化需求。 我们在做多渠道支付的时候&#xff0c;接收支付或退款的回调报文&#xff0c;然后去处理。这就意味着&…

对话音视频牛哥:如何设计功能齐全的跨平台低延迟RTMP播放器

开发背景 2015年&#xff0c;我们在做移动单兵应急指挥项目的时候&#xff0c;推送端采用了RTMP方案&#xff0c;这在当时算是介入RTMP比较早的了&#xff0c;RTMP推送模块做好以后&#xff0c;我们找了市面上VLC还有Vitamio&#xff0c;来测试整体延迟&#xff0c;实际效果真…