leetcode:字符串相乘(两种方法)

news2024/11/16 3:33:46

题目:

给定两个以字符串形式表示的非负整数 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本身。

代码实现1

class Solution
{
public:
    string multiply(string num1, string num2)
    {
        if (num1 == "0" || num2 == "0")
        {
            return "0";
        }

        int m = num1.size() - 1;
        int n = num2.size() - 1;
        string ret = "0";//用于字符串的相加
        for (int i = n; i >= 0; i--)//num2的每一位固定住,去和num1的所有位相乘
        {
            string s;//存储num2的某一位与num1所有位相乘的结果
            int j = 0;
            for ( j = n; j > i; j--)//由于是从后往前存的,所以要先补齐结果的0
            {
                s += '0';
            }

            int carry = 0;
            int x = num2[i] - '0';//num2的某一位
            for (j = m; j >= 0; j--)//num1的所有位
            {
                int y = num1[j] - '0';
                int mul = x * y + carry;
                s += mul % 10 + '0';
                carry = mul / 10;
            }

            if (carry)
            {
                s += carry + '0';
            }

            reverse(s.begin(), s.end());//倒着存的,要逆置一下
            ret = addstring(ret, s);//num2的某一位与num1相乘的结果与之前的结果相加
        }
        return ret;
    }

    string addstring(const string& num1, const string& num2)//字符串相加算法
    {
        int m = num1.size() - 1;
        int n = num2.size() - 1;
        int carry = 0;
        string s;
        while (m >= 0 || n >= 0 || carry)
        {
            int x = m >= 0 ? num1[m] - '0' : 0;//已经遍历结束的,以0来替补不存在的位
            int y = n >= 0 ? num2[n] - '0' : 0;
            int sum = x + y + carry;
            s += sum % 10 + '0';
            carry = sum / 10;
            m--;
            n--;
        }
        reverse(s.begin(), s.end());//也是倒着存的,所以要逆置一下
        return s;
    }
};

思路详解:

1 选择num1或者num2字符串固定住,这里以固定num2为例

2 num2的每一位都与num1相乘,得到一个字符串

3 将这些字符串相加(注意在相加前该补0的要补0)

注意:当num1或是num2为0时,要返回"0",不能按照以上思路去计算

比如,num1为"123"  num2为"0"时,计算的结果是"000"而不是"0"

 代码实现2

相较代码1,代码2的解题思路效率高

class Solution
{
public:
    string multiply(string num1, string num2)
    {
        if (num1 == "0" || num2 == "0")
        {
            return "0";
        }
       
        int m = num1.size();
        int n = num2.size();

        vector<int> v(m + n);//提前开m+n个空间
        for (int i = m - 1; i >= 0; i--)//num1的每一位固定住,与num2的所有位相乘,所得结果存入数组中
        {
            int x = num1[i] - '0';
            for (int j = n - 1; j >= 0; j--)
            {
                int y = num2[j] - '0';
                v[i + j + 1] += x * y;//注意是+=
            }
        }

        for (int i = m + n - 1; i > 0; i--)//让数组中的前一位的结果加上后一位/10
        {
            v[i - 1] += v[i] / 10;
            v[i] %= 10;//只余下位数为1的数字
        }

        int index = v[0] == 0 ? 1 : 0;//数组中有效数据的起始位置
        string s;
        while (index < m + n)//将数组中的数据写入字符串中
        {
            s += v[index++] + '0';
        }
        return s;
    }
};

思路详解:

利用数组,数组提前开m+n个空间,因为m长度的数字与n长度的数字相乘,所得结果长度为m+n或者是m+n-1

1 随意选择num1,num2中的一个固定住,这里以固定num1为例

2 num1的每一位与num2的所有位相乘,所得数字存入数组中

3 让数组数据中的前一个加上后一个/10

   后一个%=10,变成位数为1的数字

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

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

相关文章

在线转换器有哪些优势?在线Word转PDF操作分享

我们如果想要将两者不同格式文件进行格式转换&#xff0c;就需要下载安装转换器。如果出门带的设备没有安装转换软件客户端&#xff0c;就无法使用&#xff0c;会比较麻烦。现在有了在线转换工具&#xff0c;只需要打开相应的网页就可使用&#xff0c;那么在线Word转PDF的操作是…

接口自动化yaml文件读取与写入

前言 在走进yaml文件之前大家应该都很想知道他是用来干嘛的&#xff1f; 是的是的&#xff0c;他是用来做接口自动化测试的。 我们一起来学习他吧&#xff01;——&#xff08;一定要收藏带走哦❤&#xff09; 1、yaml文件有什么作用呢&#xff1f; ①可作为配置文件使用—…

基于java SpringBoot+Vue+html 的大学生体质测试管理系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 简介效果图系统首页模块管理员功能模块用户功能模块教师功能模块 部分源码源码下载地址 简介 本…

如何恢复指定电脑分区数据?数据恢复有它

如何恢复指定电脑分区数据&#xff1f;恢复指定电脑分区数据通常是指在电脑硬盘上的某个特定分区中丢失的数据&#xff0c;经过一定的操作将这些数据重新找回的过程。 图片来源于网络&#xff0c;如有侵权请告知 这通常涉及使用恢复软件来扫描和检测分区中丢失的文件&#xf…

第六次作业 运维高级 docker容器

1.安装docker服务&#xff0c;配置镜像加速器 卸载旧版本 yum remove docker docker-common docker-selinux docker-engine使用yum源安装 &#xff08;1&#xff09;安装Docker所需要的一些工具包 yum install -y yum-utils&#xff08;2&#xff09; 建立Docker仓库 (映射…

LeetCode——二叉树篇(六)

刷题顺序及思路来源于代码随想录&#xff0c;网站地址&#xff1a;https://programmercarl.com 106. 从中序与后序遍历序列构造二叉树 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&…

【PCIE体系结构十七】PCIE电源管理之PCI-PM

&#x1f449;个人主页&#xff1a;highman110 &#x1f449;作者简介&#xff1a;一名硬件工程师&#xff0c;持续学习&#xff0c;不断记录&#xff0c;保持思考&#xff0c;输出干货内容 参考书籍&#xff1a;《PCI.EXPRESS系统体系结构标准教材 Mindshare》 目录 设…

14. 利用Canvas自制时钟组件

1. 说明 在自定义时钟组件时&#xff0c;使用到的基本控件主要是Canvas&#xff0c;在绘制相关元素时有两种方式&#xff1a;一种时在同一个canvas中绘制所有的部件元素&#xff0c;这样需要不断的对画笔和画布的属性进行保存和恢复&#xff0c;容易混乱&#xff1b;另一种就是…

【C++】做一个飞机空战小游戏(十二)——游戏源代码、音效、图标等资源文件

[导读]本系列博文内容链接如下&#xff1a; 【C】做一个飞机空战小游戏(一)——使用getch()函数获得键盘码值 【C】做一个飞机空战小游戏(二)——利用getch()函数实现键盘控制单个字符移动【C】做一个飞机空战小游戏(三)——getch()函数控制任意造型飞机图标移动 【C】做一个飞…

基于微信小程序的短文作文写作竞赛管理系统

随着世界经济信息化、全球网络化的到来推动信息线上管理的飞速发展&#xff0c;为短文写作竞赛行业的改革起到关键作用。若想达到安全&#xff0c;快捷的目的&#xff0c;就需要拥有信息化的组织和管理模式&#xff0c;建立一套合理、畅通、高效的短文写作竞赛管理系统小程序。…

js中的正则表达式(一)

目录 1.什么是正则表达式 2.正则表达式在JavaScript中的使用场景: 3.正则表达式的语法&#xff1a; 1.什么是正则表达式 正则表达式(Regular Expression&#xff09;是用于匹配字符串中字符组合的模式。在JavaScript中&#xff0c;正则表达式也是对象通常用来查找、替换那些符…

亚马逊搜索关键词下单怎么操作

亚马逊鲲鹏系统可以根据产品关键词搜索后进行下单购买&#xff0c;多个亚马逊买家号搜索关键词下单可以帮助关键词上首页&#xff0c;具体操作如下&#xff1a; 首先需要先准备好一批能下单的买家账号及代理ip&#xff0c;准备好之后就可以设置需要下单的关键词及asin进行货比…

由于找不到concrt140.dll,无法继续执行代码怎么办

今天我想和大家分享一下我在修复concrt140.dll文件过程中的经验。作为一名程序员&#xff0c;我们经常会遇到各种各样的问题&#xff0c;而这次我所遇到的这个问题对我来说是一个挑战。在经过一番努力之后&#xff0c;我终于找到了解决方法&#xff0c;并且成功地修复了concrt1…

Markdown 基本语法

风无痕 August 21,2023 总览 几乎所有 Markdown 应用程序都支持 John Gruber 原始设计文档中列出的 Markdown 基本语法。但是&#xff0c;Markdown 处理程序之间存在着细微的变化和差异&#xff0c;我们都会尽可能标记出来。 标题&#xff08;Headings&#xff09; 要创建标…

信息安全/网络安全专业好不好?

​本人信息安全专业毕业&#xff0c;在甲方互联网大厂安全部与安全乙方大厂都工作过&#xff0c;有一些经验可以供对安全行业感兴趣的人参考。 或许是因为韩商言让更多人知道了CTF&#xff0c;也或许是因为网络安全越来越受国家重视&#xff0c;安全最近愈加火爆了。当然&…

司徒理财:8.21黄金空头呈阶梯下移!今日操作策略

黄金走势分析 盘面裸k分析&#xff1a;1小时周期的行情局部于1896附近即下行通道上轨附近录得一系列的K线呈震荡下行并筑圆顶&#xff0c;上轨压制有效&#xff0c;下行通道并未突破&#xff0c;后市建议延续看下行。4小时周期局部录得一系列的纺锤线呈震荡&#xff0c;但行情整…

ppt怎么做流程图?一文详解如何在ppt上绘制流程图!

ppt怎么做流程图&#xff1f;ppt制作流程图的方法是什么&#xff1f;本文将介绍2个在PPT中做流程图的方法&#xff0c;一起往下看吧。 方法一&#xff1a;利用PowerPoint自带功能 &#xff08;1&#xff09;使用SmartArt功能制作流程图 打开Microsoft PowerPoint并新建一…

测试Qt是否安装成功

1.打开Qt软件 选择新建项目,new 选择基类时&#xff0c;一次使用选择QWigget空白窗口&#xff0c;还有2种&#xff0c;带菜单栏的窗口和对话框窗口。选中Generate form会生成图形界面&#xff0c;组件直接拖拉&#xff0c;不需要自己编写。 运行结果&#xff1a;

【ICCV2023】Adaptive Frequency Filters As Efficient Global Token Mixers

Adaptive Frequency Filters As Efficient Global Token Mixers 论文&#xff1a;https://arxiv.org/abs/2307.14008 代码&#xff1a;暂未开源 解读&#xff1a;ICCV23&#xff5c;轻量级视觉主干网络AFFNet&#xff1a;频域自适应频段过滤空域全局动态大卷积核 - 知乎 (zh…

热烈祝贺贵州董程酿酒成功入选航天系统采购供应商库

经过航天系统采购平台的严审&#xff0c;贵州董程酿酒有限公司成功入选中国航天系统采购供应商库。航天系统采购平台是航天系统内企业采购专用平台&#xff0c;服务航天全球范围千亿采购需求&#xff0c;目前&#xff0c;已有华为、三一重工、格力电器、科大讯飞等企业、机构加…