网站首页 > java教程 正文
字符串相乘
题目描述:给定两个以字符串形式表示的非负整数 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"));
}
}
【每日寄语】 再长的路,一步步也能走完,再短的路,不迈开双脚也无法到达。
猜你喜欢
- 2024-11-24 Java基础刷题,一篇入门
- 2024-11-24 LeetCode题解|1047.删除字符串中的所有相邻重复项
- 2024-11-24 java集合框架-Collection与List集合
- 2024-11-24 悟空云课堂 | 第三期:路径遍历漏洞的防范与检测
- 2024-11-24 Java面试:给你15到20分钟,你把这道编程题写下
- 2024-11-24 一个简单的字符串,为什么 Redis 要设计的如此特别
- 2024-11-24 Go&Java算法之至少有K个重复字符的最长子串
- 2024-11-24 2021-06-25:只由小写字母(a~z)组成的一批字符串,都放在字符
- 2024-11-24 剑指offer(二十七)-字符串的排列(Java版)
- 2024-11-24 Python和Java解题:最长回文子串
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)