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

示例 1:
输入: num1 = "2", num2 = "3"
输出: "6" 示例 2:
输入: num1 = "123", num2 = "456"
输出: "56088" 说明:
num1 和 num2 的长度小于110。
num1 和 num2 只包含数字 0-9。
num1 和 num2 均不以零开头,除非是数字 0 本身。
不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。
解题思路
  1. 先算num1和num2的长度
  2. 两数相乘,最大长度为2个值的长度和,所以创建一个数组,长度为两个字符串的长度和
  3. 从num2的个位开始,依次和num1的每一位相乘,个位的位置为i+j+1,进位的位置为i+j,将个位和进位依次放入数组,个位是相乘的结果加上要放入的位置的值的和的个位,进位的位置是在原数据的基础上加上进位的值。最后输出字符串
解题例子
789 * 256
数值:num1 = 789, num2 = 256
长度:n1 = 3,n2 = 3
相乘之后的答案的长度最大为6,所以,数组result[]长度为6 从256的最后一位开始,也就是6 j = 2,i = 2,那么个位位置为p2 = i + j + 1= 5,进位位置为p1 = i + j = 4 , 6 * 9 + 0= 54 ,result = [ , , , ,5,4] j = 2,i = 1,那么个位位置为p2 = i + j + 1= 4,进位位置为p1 = i + j = 3 , 6 * 8 + 5 = 53 ,result = [ , , ,5,3,4] j = 2,i = 0,那么个位位置为p2 = i + j + 1= 3,进位位置为p1 = i + j = 2 , 6 * 7 + 5 = 47 ,result = [ , ,4,7,3,4] j = 1,i = 2,那么个位位置为p2 = i + j + 1= 4,进位位置为p1 = i + j = 3 , 5 * 9 + 3 = 48 ,result = [ , ,4,11,8,4] j = 1,i = 1,那么个位位置为p2 = i + j + 1= 3,进位位置为p1 = i + j = 2 , 5 * 8 + 11 = 51 ,result = [ , ,9,1,8,4] j = 1,i = 0,那么个位位置为p2 = i + j + 1= 2,进位位置为p1 = i + j = 1 , 5 * 7 + 9 = 44 ,result = [ ,4,4,1,8,4] j = 0,i = 2,那么个位位置为p2 = i + j + 1= 3,进位位置为p1 = i + j = 2 , 2 * 9 + 1 = 19 ,result = [ ,4,5,9,8,4] j = 0,i = 1,那么个位位置为p2 = i + j + 1= 2,进位位置为p1 = i + j = 1 , 2 * 8 + 5 = 21 ,result = [ ,6,1,9,8,4] j = 0,i = 0,那么个位位置为p2 = i + j + 1= 1,进位位置为p1 = i + j = 0 , 2 * 7 + 6 = 20 ,result = [2,0,1,9,8,4] 最终结果是201984
代码实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
class  {
public String multiply(String num1, String num2) {
大专栏  LeetCode43(字符串相乘)="keyword">if (num1 == null || num1.length() == 0 || num2 == null || num2.length() == 0) {
return "";
}
int n1 = num1.length();
int n2 = num2.length();
if (n1 == 1 && Integer.parseInt(num1) == 0) {
return num1;
}
if (n2 == 1 && Integer.parseInt(num2) == 0) {
return num2;
} int result[] = new int[n1 + n2]; for (int j = n2 - 1; j >= 0; j--) {
for (int i = n1 - 1; i >= 0; i--) {
int p1 = i + j;
int p2 = i + j + 1; //每次 num2.charAt(j) * num1.charAt(i)的值的个位位置
int sum = (num2.charAt(j) - '0') * (num1.charAt(i) - '0') + result[p2];
result[p2] = sum % 10; //当前值的个位数字
result[p1] += sum / 10;//加上进位的值 }
}
StringBuilder finalResult = new StringBuilder();
for (int num : result) {
if (num == 0 && finalResult.length() == 0) {
continue;
}
finalResult.append(num);
} return finalResult.length() == 0 ? "0" : finalResult.toString();
} } public class ByteDanceFourth {
public static void main(String[] args) {
System.out.println("请输入第一个字符串:");
Scanner scanner1 = new Scanner(System.in);
String num1 = scanner1.next(); System.out.println("请输入第二个字符串:");
Scanner scanner2 = new Scanner(System.in);
String num2 = scanner2.next(); String x = new FourthSolution().multiply(num1, num2);
System.out.println(x); }
}

LeetCode43(字符串相乘)的更多相关文章

  1. [Swift]LeetCode43. 字符串相乘 | Multiply Strings

    Given two non-negative integers num1 and num2 represented as strings, return the product of num1and  ...

  2. LeetCode 43. 字符串相乘(Multiply Strings)

    43. 字符串相乘 43. Multiply Strings 题目描述 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式. ...

  3. 代码题(59)— 字符串相加、字符串相乘、打印最大n位数

    1.415. 字符串相加 给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和. 思路:和链表相加类似,求进位. class Solution { public: string addS ...

  4. Java实现 LeetCode 43 字符串相乘

    43. 字符串相乘 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式. 示例 1: 输入: num1 = "2& ...

  5. [LeetCode]415. 字符串相加、43. 字符串相乘

    题目 415. 字符串相加 给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和. 题解 维护一个temp表示当前两数相加+上一个进位的和. 每次更新结果的一位. 注意终止条件. 最后将 ...

  6. Leetcode43. Multiply Strings字符串相乘(大数相乘)

    给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式. 示例 1: 输入: num1 = "2", num ...

  7. [LeetCode] Multiply Strings 字符串相乘

    Given two numbers represented as strings, return multiplication of the numbers as a string. Note: Th ...

  8. LeetCode(43):字符串相乘

    Medium! 题目描述: 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式. 示例 1: 输入: num1 = &quo ...

  9. [LeetCode] 43. Multiply Strings ☆☆☆(字符串相乘)

    转载:43. Multiply Strings 题目描述 就是两个数相乘,输出结果,只不过数字很大很大,都是用 String 存储的.也就是传说中的大数相乘. 解法一 我们就模仿我们在纸上做乘法的过程 ...

随机推荐

  1. github新手使用教程

    1.首先打开https://github.com/官网 注册一个github账号 2.注册成功之后,登录账号,创建一个属于自己的库 3.创建完成之后,为了方便电脑上的代码上传到github 仓库上,要 ...

  2. cf1172E Nauuo and ODT(LCT)

    首先可以转化问题,变为对每种颜色分别考虑不含该颜色的简单路径条数.然后把不是当前颜色的点视为白色,是当前颜色的点视为黑色,显然路径数量是每个白色连通块大小的平方和,然后题目变为:黑白两色的树,单点翻转 ...

  3. Python(os和sys)使用

    Python(os和sys)理解 os模块负责程序与操作系统的交互,提供了访问操作系统底层的接口; sys模块负责程序与python解释器的交互,提供了一系列的函数和变量,用于操控python的运行时 ...

  4. dynamic用法

    https://www.cnblogs.com/lgx5/p/9650203.html https://www.cnblogs.com/gygtech/p/9915367.html

  5. zabbix监控Linux服务器丢包率

    http://www.ttlsa.com/zabbix/zabbix-simple-checks/  这个文章看了,还没有实践 1.先创建监控项,键值如下 icmppingloss[<121.1 ...

  6. 42)PHP,mysqli函数功能总结

    fetch----------------一个一个的取值,这个注意 fetch_array(),fetch_assoc(),fetch_object(),这三个方法的使用请看手册 请注意是FETCH, ...

  7. linux中find,locate,whereis,which关系和用法

    主要有find,locate,whereis,which等 1. find是最常用也是最强大的查找命令,它可以查找任何类型的文件. find命令的一般格式为:find <指定目录>< ...

  8. PAT甲级——1008 Elevator

    PATA1008 Elevator The highest building in our city has only one elevator. A request list is made up ...

  9. 【学习笔记】 Johnson 全源最短路

    前置扯淡 一年多前学的最短路,当时就会了几个名词的拼写,啥也没想过 几个月之前,听说了"全源最短路"这个东西,当时也没说学一下,现在补一下(感觉实在是没啥用) 介绍 由于\(spf ...

  10. nmon监控指标

    一.NMON中的各项参数指标: SYS_SUMM:显示当前服务器的总体性能情况 Total System I/OStatistics: Avg tps during an interval:显示采集间 ...