LeetCode43. 字符串相乘(Java解法)

news2025/1/13 7:48:34

0 题目描述

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

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

示例 1:

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

输入: num1 = “123”, num2 = “456”
输出: “56088”
题目来源:力扣(LeetCode43. 字符串相乘)

1 算法思想

这道题思路挺容易想到的,难在不用API怎么处理求得的大整数。
在这里插入图片描述 (图片来源力扣官方 ps:懒得画图了,借用一下。)
如图,可以把1234 * 456 拆分成:7 * 1234 + 6 * 1234 * 10 + 5 * 1234 * 100 = 699678
这里涉及到两个过程:一个是两个大整数的加法,另外一个是单个数与另外一个大整数的乘法。
此外需要考虑到一种特殊情况,就是num1或num2为0时,乘积为0。

2 实现代码

  public String multiply(String num1, String num2) {
        if(num1.equals("0") || num2.equals("0") ) return "0";
        char[] nums1 = num1.toCharArray();
        char[] nums2 = num2.toCharArray();
        //List用于收集计算得到的乘积
        List<String> list = new ArrayList<>();
        for(int i=nums2.length-1;i>=0;i--){
             int carry = 0; //进位
             StringBuilder strBuilder = new StringBuilder();  //保存每次得到的乘积
            for(int j=nums1.length-1;j>=0;j--){
                int a = nums2[i] - '0';
                int b = nums1[j] - '0';
                int res = a * b + carry;
                carry = res /10;
                res %= 10;
                strBuilder.append(res);
            }
            //最后判断是否还要进位
            if(carry != 0) strBuilder.append(carry);
            list.add(strBuilder.reverse().toString());
        }
        String res = "";
        for(int i=0;i<list.size();i++){
            String str1 = list.get(i);
            for(int k=0;k<i;k++) str1 += "0";
           res = addString(res,str1);
        }
        return res;
    }   

   //求两个大整数的和
    public String addString(String num1,String num2){
        //首先将两个字符串转换为char数组,方便操作
        char[] nums1 = num1.toCharArray();
        char[] nums2 = num2.toCharArray();
        //StringBuilder用于保存计算的结果
        StringBuilder strBuilder = new StringBuilder();
        int len1 = nums1.length-1;
        int len2 = nums2.length-1;
        int carry = 0;  //进位
        while(len1 >=0 || len2 >=0 || carry != 0){
            int a = (len1 >= 0 ? nums1[len1]-'0' : 0) ;
            int b = (len2 >= 0 ? nums2[len2]-'0' : 0);
            int sum = a + b + carry;
            carry = sum / 10;
            strBuilder.append(sum%10);
            len1--;
            len2--;
        }
        //注意,strBuilder中保存的结果还需要反转才能得到正确的顺序
        return strBuilder.reverse().toString();
    }

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

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

相关文章

【三十天精通 Vue 3】 专栏内容介绍

在这个专栏中&#xff0c;我们将带你深入了解 Vue 3 的各个方面。首先&#xff0c;我们将带你了解 Vue 3 的新特性和改进&#xff0c;包括 Composition API、Provide/Use Case、Vuex 3 等。然后&#xff0c;我们将详细介绍 Vue 3 的组件化开发、路由、状态管理等方面的内容。 …

LineSegmentIntersector::Intersections中ratio含义及LineSegmentIntersector相交点说明

osg用osgUtil库中的LineSegmentIntersector、IntersectionVisitor类来求线段和三维模型的交点 如下代码&#xff1a; #include <QtCore/QCoreApplication> #include <osgViewer/Viewer> #include <osgViewer/ViewerEventHandlers> #include <osgViewer…

Duboo介绍与入门

文章目录 1、Dubbo的前世今生2、Dubbo的快速入门2.1、Dubbo的基本架构2.2、Nacos2.3、管理后台2.4、入门案例2.4.1、服务提供者搭建环境代码实现配置文件 2.4.2、服务消费者搭建环境代码实现配置文件 最后说一句 1、Dubbo的前世今生 2011年10月27日&#xff0c;阿里巴巴开源了…

Vue项目解决跨域问题

跨域&#xff08;Cross-Origin&#xff09;是指在浏览器中运行的 JavaScript 代码试图访问不同源的资源时所遇到的一类限制问题。不同源是指协议&#xff08;http、https&#xff09;、域名&#xff08;example.com、google.com&#xff09;、端口号&#xff08;80、8080&#…

双时间维度,你的时间管理大师丨三叠云

双时间维度 路径 表单 >> 表单设计 功能简介 「甘特图视图」新增 双时间维度设置 的配置项。 为了解决日常任务管理中对于“计划时间”维度的时间设置问题&#xff0c;【时间设置】项增加了【双时间维度设置】的配置项&#xff0c;用户开启后可以设置 计划开始时间 …

Matlab 牛顿迭代法(1)牛顿法

一、牛顿迭代公式 1、定义 2、原理推导 泰勒公式&#xff1a; 常用的8个泰勒公式&#xff1a; 推导&#xff1a; 将f(x)f(x)在Xk 处的泰勒公式展开&#xff1a; f(x)f(Xk)f(Xk)(X-Xk) f(Xk)/2 *(x-Xk)^2.......... 我们吧线性的一部分先拿出来&#xff1a;f(x)f(Xk)f(X…

【python知识】容器对象的推导式

一、说明 Python 推导式&#xff0c;是针对容器对象&#xff08;列表,字典&#xff0c;集合&#xff0c;元组&#xff09;的产生方式的语句。它可以从一个数据序列构建另一个新的数据序列的结构体。 Python 支持各种数据结构的推导式&#xff1a; 列表(list)推导式字典(dict)推…

【Java|golang】1048. 最长字符串链

给出一个单词数组 words &#xff0c;其中每个单词都由小写英文字母组成。 如果我们可以 不改变其他字符的顺序 &#xff0c;在 wordA 的任何地方添加 恰好一个 字母使其变成 wordB &#xff0c;那么我们认为 wordA 是 wordB 的 前身 。 例如&#xff0c;“abc” 是 “abac”…

拍卖小程序开发:从需求分析到设计实现

在当今数字时代&#xff0c;拍卖小程序已经成为了一个重要的销售和交易工具。拍卖小程序的开发不仅能够提供高效的销售渠道&#xff0c;还能够为用户提供全新的购物体验。因此&#xff0c;开发一个拍卖小程序成为了许多商家的首要任务。 拍卖小程序的开发可以帮助商家拓展销售…

uniapp打包

niapp 的打包首先要先配置&#xff0c;配置好了才能去进行打包&#xff0c;如图所示。 这只是第一步。 注意&#xff1a; 1.运行基础路径最好用 ./ &#xff0c;如果配置了其他请自行添加路径。 2.由于uniapp 的特性&#xff0c;所以导致了不支持 history 模式&#xff0c;…

第13届蓝桥杯国赛真题剖析-2022年5月29日Scratch编程初中级组

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第127讲。 第13届蓝桥杯Scratch国赛真题&#xff0c;这是2022年5月29日举办的全国总决赛&#xff0c;比赛仍然采取线上…

三分钟教你看懂 spring 官方文档

新手如何学会查看官方文档API 首先进入官网&#xff1a;这里以 spring boot 为例 &#xff0c;进入spring 官方地址 我们进入 spring boot 这里我们要看文档当然是要 learn 了&#xff0c;所以点进去。 我需要的东西在 IO 模块里面&#xff0c;点 IO 进入 发送邮件是不是有了…

python+nodejs+php+springboot+vue 高校大学生创业管理系统

本论文主要论述了如何使用java语言开发一个高校创新创业管理系统&#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;将论述高校创新创业管理系统的当前背景以及系统开发的目的&#xff0c;后续章节将…

node注册和登录你真的清楚了吗?

文章目录 1.创建数据表1.1 创建用户表 2安装并配置mysql文件2.1安装mysql模块2.2 在db index中 3.注册功能3.1检测表单数据合法3.2判断用户占用3.3 密码加密3.4 插入用户封装错误处理函数 4.登录功能4.1 登录密码的判断4.2 生成token字符4.3 解析token中间件 1.创建数据表 1.1…

AD9208子卡设计资料: 2 路 2.6GSPS/3GSPS AD 采集、2 路 12.6G DA 回放、高性能时钟发生器HMC7044 -FMC 子卡模块

板卡概述 FMC123 是一款基于 FMC 标准规范&#xff0c;实现 2 路 14-bit、3GSPSADC 采集功能、2 路 16-bit 12.6GSPS 回放子卡模块。该模块遵循 VITA57.1 标准&#xff0c;可直接与 FPGA 载卡配合使用&#xff0c;板卡 ADC 器件采用 ADI 公司的 AD9208 芯片&#xff0c;&…

如何在Linkedin领英上找客户

LinkedIn是很多想要获客的朋友&#xff0c;不错的选择&#xff0c;它是一家全球职业社交平台&#xff0c;目前全球会员人数已达6亿之多。在领英&#xff0c;我们可以轻松打造职业形象、获取商业洞察、拓展职业人脉并发现更多职业机遇。 Linkedin主要的作用有以下四点 &#xf…

API 文档管理得这么玩,才会效率加倍

随着互联网的迅速发展&#xff0c;越来越多的企业和开发者开始采用 API 接口作为数据交换和服务调用的标准方式。为了保证API接口的可靠性、稳定性和可维护性&#xff0c;API 文档管理变得愈发重要。 API 文档管理的重要性 API 文档管理是指在开发过程中&#xff0c;对API接口…

Seurat -- ScaleData学习

brief seurat提供了一个教学&#xff0c;其中global scale normalization之后又对数据进行了scale。 默认是对上一步 selected highly variable features进行scale。 概要图以及系列博文可以参见链接。 如果是 SCTransform则不需要手动运行这一步。 下面是就是教程提供的流程…

为什么软件iic需要用开漏输出和上拉电阻

1、疑惑&#xff1a; 不知道大家有没有这种疑惑&#xff0c;在软件iic的配置过程当中&#xff0c;有些时候要输出高低电平&#xff0c;为什么使用开漏输出而不是推挽输出&#xff1f; 2.推挽输出和开漏输出的区别 推挽输出: 输出逻辑0&#xff0c;则N-MOS激活&#xff1b;输…

<C++>类和对象-上

目录 前言 一、类的引入 二、类的定义 1.类的两种定义方式 三、类的访问限定符及封装 1.访问限定符 2.封装 四、类的作用域 五、类的实例化 六、类对象模型 1.计算类对象的大小 2 类对象的存储方式猜测 3. 结构体内存对齐规则 七、this指针 1. 引入 2 this指针的特性 总结 前言…