字符串相乘

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

示例说明请见LeetCode官网。

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/multiply-strings/

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法一:数组遍历
  • 首先,如果num1和num2有为0的,直接返回空字符串。
  • 否则,声明一个list为temp用来记录每一行的乘积的结果;
  • 然后将这些行的结果累加起来;
  • 最后将累加的结果按倒序拼成字符串返回。
import java.util.ArrayList;
import java.util.List; public class LeetCode_043 {
public static String multiply(String num1, String num2) {
if ((num1 == null || num1.length() == 0) || (num2 == null || num2.length() == 0)) {
return "";
}
if (num1.equals("0") || num2.equals("0")) {
return "0";
}
/**
* 如果num2的长度大于num1的长度将num1和num2的值交换
*/
if (num2.length() > num1.length()) {
String temp = num1;
num1 = num2;
num2 = temp;
}
/**
* 记录每一行的乘积的结果
*/
List<int[]> temp = new ArrayList<>();
int count = 0;
for (int i = num2.length() - 1; i >= 0; i--) {
int c2Num = num2.charAt(i) - '0';
int[] cur = new int[num1.length() + num2.length()];
int index = 0;
for (; index < count; index++) {
cur[index] = 0;
}
int addOne = 0;
for (int j = num1.length() - 1; j >= 0; j--) {
int c1Num = num1.charAt(j) - '0';
if (c2Num * c1Num + addOne > 9) {
cur[index++] = (c2Num * c1Num + addOne) % 10;
addOne = (c2Num * c1Num + addOne) / 10;
} else {
cur[index++] = c2Num * c1Num + addOne;
addOne = 0;
}
}
if (addOne > 0) {
cur[index] = addOne;
}
temp.add(cur);
count++;
} int addOne = 0;
List<Integer> result = new ArrayList<>();
/**
* 将每一行的乘积结果累加起来
*/
for (int i = 0; i < num1.length() + num2.length(); i++) {
int curNum = addOne;
for (int[] ints : temp) {
curNum += ints[i];
}
if (curNum > 9) {
result.add(curNum % 10);
addOne = curNum / 10;
} else {
result.add(curNum % 10);
addOne = 0;
}
} String resultStr = "";
int firstNoneZeroIndex = -1;
/**
* 找到第一个不为0的数字
*/
for (int i = result.size() - 1; i >= 0; i--) {
if (result.get(i) != 0) {
firstNoneZeroIndex = i;
break;
}
}
/**
* 将最后的结果拼成string并最后返回
*/
for (int i = firstNoneZeroIndex; i >= 0; i--) {
resultStr += String.valueOf(result.get(i));
}
return resultStr;
} public static void main(String[] args) {
// 测试用例,预计输出: 56088
System.out.println(multiply("123", "456"));
}
}

【每日寄语】 再长的路,一步步也能走完,再短的路,不迈开双脚也无法到达。

LeetCode-043-字符串相乘的更多相关文章

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

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

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

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

  3. LeetCode 43 字符串相乘

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

  4. LeetCode 43. 字符串相乘(Multiply Strings) 大数乘法

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

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

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

  6. Leetcode中字符串总结

    本文是个人对LeetCode中字符串类型题目的总结,纯属个人感悟,若有不妥的地方,欢迎指出. 一.有关数字 1.数转换 题Interger to roman和Roman to integer这两题是罗 ...

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

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

  8. LeetCode:字符串的排列【567】

    LeetCode:字符串的排列[567] 题目描述 给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列. 换句话说,第一个字符串的排列之一是第二个字符串的子串. 示例1: ...

  9. 前端与算法 leetcode 8. 字符串转换整数 (atoi)

    目录 # 前端与算法 leetcode 8. 字符串转换整数 (atoi) 题目描述 概要 提示 解析 解法一:正则 解法二:api 解法二:手搓一个api 算法 传入测试用例的运行结果 执行结果 G ...

  10. 前端与算法 leetcode 387. 字符串中的第一个唯一字符

    目录 # 前端与算法 leetcode 387. 字符串中的第一个唯一字符 题目描述 概要 提示 解析 解法一:双循环 解法二:Set法单循环 算法 传入测试用例的运行结果 执行结果 GitHub仓库 ...

随机推荐

  1. python 小兵(7)迭代器

    阅读目录 函数名的使用以及第一类对象 闭包 迭代器 回到顶部 函数名的使用以及第一类对象 函数名的运用 函数名是一个变量, 但它是一个特殊的变量, 与括号配合可以执行函数的变量 1.函数名的内存地址 ...

  2. JavaScript之递归查找所有父节点

    ......data: () => ({ // 数据 dt: [{ id: '1', children: [ { id: '1-1', children: [ { id: '1-1-1', ch ...

  3. Git配置用户信息和SSH免密

    一.配置用户信息 1.查看配置信息 # 查看所有配置 $ git config -l/--list # 查看系统配置 $ git config --system -l/--list # 查看用户配置 ...

  4. LCT 入门

    这是一份 \(\rm LCT\) 入门总结. 关于 \(\rm LCT\) 的复杂度这里不会提及,只会记录 \(\rm LCT\) 的基本操作和经典例题,但神奇的 \(\rm LCT\) 虽然常数巨大 ...

  5. 实现表单input文本框不可编辑的三种方法

    感谢原文作者:青灯夜游 原文链接:https://www.php.cn/div-tutorial-413133.html 目录 问题 实现方式 1.οnfοcus=this.blur() 2.read ...

  6. 类扩展(Class Extension)

    类扩展(Class Extension) 也有人称为匿名分类 - 作用     - 能为某个类增加额外的属性.成员变量.方法声明     - 一般将类扩展写到.m文件中     - 一般将一些私有的属 ...

  7. Java 获取本机局域网内IP

    主要涉及NetworkInterface.Enumeration.InetAddress等类 /* 获取本机网内地址 */ public static InetAddress getInet4Addr ...

  8. OC和C对比

    1.源文件对比 C语言中常见源文件.h头文件,.c文件 文件扩展名 源类型 .h 头文件,用于存放函数声明 .c C语言源文件,用于实现头文件中声明的方法 OC中的源文件.h头文件,.m与.mm的实现 ...

  9. java创建一个子类对象是会调用父类的构造方法会不会创建父类

    1.子类在创建实例后,类初始化方法会调用父类的初始化方法(除了Java.lang.Object类,因为java.lang.Object类没有父类),而这种调用会逐级追述,直到java.lang.Obj ...

  10. PHP程序员可以这样准备找工作

    你好,是我琉忆.PHP程序员面试笔试图书系列作者. 今天就跟大家聊聊作为一个PHP程序员,每年的跳槽季都应该怎么准备一番. 其实普遍的跳槽季总的就有2个. 分别是新年后的3-4月,还有9-10月份. ...