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

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

前言

本题牛牛写了很久,起初对每次相乘的结果就进位处理了,最后还需要考虑错位相加,进行补0等,花了半天也没搞出来.

所幸学到了一种高效且相对简单的方法解决此题,希望对友友们有所帮助.

d8adb73ba51e4a8d830bb65f0886baef.gif

一、字符串相乘

题目介绍

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


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


示例1:

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

示例2:

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

思路分析

05a05ee0374f4d758dcc6287301e1905.png

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


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


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


8f2ddb7e9bb54b84b90618d43eab0f1a.png

4.arr数组创建多大的空间?

   一个最小的二位数 × 一个最小的三位数 结果是一个四位数

   10100=1000

   一个最大的二位数 × 一个最大的三位数 结果是一个五位数

   99999=98901

   综上呢,两个数相乘,他们的结果的位数是[length1 + length2,length1 + length2+1],(0除外哈)

   最高位可能有数据,也可能没有数据.


5.为什么正确的位置是i+j+1?

   试着看上图分析:注意i和j都是从右边往左边遍历.

   此处是此解法的难点,通过将每次相乘后的结果放入正确的位置以实现错位相加.

   牛牛的理解是:

   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;
    }
};

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

c0a39c9d1981468f9dd9a2aa37d898c1.gif

目录
相关文章
|
编解码 iOS开发 开发者
App上架Apple App Store和Google Play流程
App上架Apple App Store和Google Play流程
491 2
|
传感器 数据采集 机器学习/深度学习
人工智能与环境保护:智能监测与治理的新策略
【9月更文挑战第21天】人工智能在环境保护中的应用,为智能监测与治理提供了新的策略和方法。通过实时数据采集与分析、智能预警与应急响应、精准化决策支持等技术的应用,AI正在引领一场革命性的变革。未来,随着技术的不断发展和应用场景的拓展,AI将在环境保护中发挥更加重要的作用,助力我们构建更加绿色、可持续的未来。让我们携手共进,共同迎接一个更加美好的明天。
|
机器学习/深度学习 算法
常见的分类算法介绍
常见的分类算法介绍
|
自然语言处理 机器人 API
解锁电商直播新纪元:无人数字人客服如何在直播间掀起智能革命,重塑顾客服务体验的未来?
【10月更文挑战第7天】随着电商直播的兴起,客户咨询量激增,传统人工客服难以应对,无人数字人直播机器人客服应运而生。本文介绍如何使用Python、LangChain和ChatGPT搭建高效客服系统,包括安装库、设置API密钥、定义问答流程、构建FAQ知识库、集成实时聊天界面及部署上线,帮助企业自动处理客户咨询,提升用户体验。
497 2
|
机器学习/深度学习 人工智能 搜索推荐
探究人工智能在医疗健康中的应用与挑战
本文深入探讨了人工智能(AI)在医疗健康领域中的应用及其所面临的挑战。随着科技的不断进步,AI技术在医疗领域的应用日益广泛,从疾病诊断、治疗方案制定到患者护理等方面都展现出巨大的潜力。然而,尽管AI在医疗健康领域取得了显著成果,但也面临着数据隐私、算法偏见和伦理道德等方面的挑战。本文将详细介绍这些应用和挑战,并探讨可能的解决方案,以期为读者提供对AI在医疗健康领域发展的全面理解。
|
传感器 监控 物联网
无线传感器网络的基本架构及其广泛应用
无线传感器网络的基本架构及其广泛应用
1118 1
|
人工智能 物联网 Android开发
探索安卓开发的未来趋势:从传统到尖端技术
随着技术的不断进步,安卓开发领域也迎来了新的变革。本文将深入探讨安卓开发的最新趋势,包括Kotlin的崛起、Flutter的应用、AI集成以及物联网的结合等方面。我们将通过分析这些技术如何影响当前的开发实践,来揭示未来安卓应用开发的可能方向。文章旨在为开发者提供前瞻性的视角,帮助他们把握技术发展的脉搏,从而在竞争激烈的市场中脱颖而出。
419 1
|
监控 数据可视化 BI
ERP系统中的财务报告与财务分析解析
【7月更文挑战第25天】 ERP系统中的财务报告与财务分析解析
704 4
|
数据采集 监控 安全
园区 AR 导航系统:技术创新与功能拓展
**维小帮园区AR导航系统**借助高精地图与AR技术,打破传统二维导航局限,提供三维立体地图和沉浸式导航体验。系统包括AR实景指引、VR全景预览、便捷预约参观和智能停车场导航等功能,大幅提升访客定位与通行效率,推动园区管理智能化。未来,该技术有望在更多领域广泛应用。
568 0
园区 AR 导航系统:技术创新与功能拓展
|
安全 数据安全/隐私保护