版权声明:本文为博主原创文章,转载请说明出处 https://blog.csdn.net/u010002184/article/details/86516073
Given two non-negative integers num1
and num2
represented as strings, return the product of num1
and num2
, also represented as a string.
Example 1:
Input: num1 = "2", num2 = "3"
Output: "6"
Example 2:
Input: num1 = "123", num2 = "456"
Output: "56088"
Note:
- The length of both
num1
andnum2
is < 110. - Both
num1
andnum2
contain only digits0-9
. - Both
num1
andnum2
do not contain any leading zero, except the number 0 itself. - You must not use any built-in BigInteger library or convert the inputs to integer directly.
方法2:是下面方法1的优化,算法逻辑都是一样的
/**
* 数组从后往前遍历
* Runtime: 21 ms, faster than 96.28% of Java online submissions for Multiply Strings.
*
* @param num1
* @param num2
* @return
*/
public String multiply(String num1, String num2) {
if ("0".equals(num1) || "0".equals(num2)) {
return "0";
}
if ("1".equals(num1)) {
return num2;
}
if ("1".equals(num2)) {
return num1;
}
int num1Length = num1.length();
int num2Length = num2.length();
int sumLength = num1Length + num2Length;//规律,比如123*456,有三个积,每次左移一位,都处理成同长的数组,多出来的位当成0,然后相加。三位数*三位数则同长数组最长是6位
int[] result = new int[sumLength];//存储结果
int leftMulti, rightMulti, product, inc = 0, startIndex = 0, index = 0;
for (int i = num1Length - 1; i >= 0; i--) {
leftMulti = num1.charAt(i) - '0';
for (int j = num2Length - 1; j >= 0; j--) {
index = i + j + 1;
rightMulti = num2.charAt(j) - '0';
product = leftMulti * rightMulti + inc + result[index];//去除对product<10,>=10的判断,直接相加再/10,%10即可
inc = product / 10;
result[index] = product % 10;
if (j == 0 && inc != 0) {
result[index - 1] = inc;//前面那一位
inc = 0;//进位已向左前进1位,别忘了置为0
}
}//for
}//for
if (inc != 0) {
result[0] = inc;
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < result.length; i++) {
if (sb.length() != 0 || result[i] != 0) {//对取结果数值的代码做优化
sb.append(result[i]);
}
}
return sb.length() == 0 ? "0" : sb.toString();
}//multiply
方法1:数字字符转换成数字直接减去'0'即可!!
/**
* <p>Title: </p>
* <p>Description: </p>
*
* @Author
* @CreateTime 2019/1/15 21:51
*/
public class Leetcode_43_MultiplyStrings {
public static void main(String[] args) {
Leetcode_43_MultiplyStrings leetcode_43_multiplyStrings = new Leetcode_43_MultiplyStrings();
// System.out.println(leetcode_43_multiplyStrings.multiply("123", "2"));//246
// System.out.println(leetcode_43_multiplyStrings.multiply("123", "12"));//1476
// System.out.println(leetcode_43_multiplyStrings.multiply("123", "9"));//1107
// System.out.println(leetcode_43_multiplyStrings.multiply("1234", "123"));//151782
// System.out.println(leetcode_43_multiplyStrings.multiply("2", "3"));//6
// System.out.println(leetcode_43_multiplyStrings.multiply("456", "123"));//56088
System.out.println(leetcode_43_multiplyStrings.multiply("123", "456"));//56088
// System.out.println(leetcode_43_multiplyStrings.multiply("9", "9"));//81
}
/**
* 数组从后往前遍历
* Runtime: 25 ms, faster than 67.41% of Java online submissions for Multiply Strings.
*
* @param num1
* @param num2
* @return
*/
public String multiply(String num1, String num2) {
if ("0".equals(num1) || "0".equals(num2)) {
return "0";
}
if ("1".equals(num1)) {
return num2;
}
if ("1".equals(num2)) {
return num1;
}
int num1Length = num1.length();
int num2Length = num2.length();
int sumLength = num1Length + num2Length;//规律,比如123*456,有三个积,每次左移一位,都处理成同长的数组,,多出来的位当成0,然后相加。三位数*三位数则同长数组最长是6位
int[] result = new int[sumLength];//存储结果
int leftMulti, rightMulti, product, inc = 0, startIndex = 0, index = 0;
for (int i = num1Length - 1; i >= 0; i--) {
rightMulti = num1.charAt(i) - '0';
for (int j = num2Length - 1; j >= 0; j--) {
index = i + j + 1;
leftMulti = num2.charAt(j) - '0';
product = leftMulti * rightMulti + inc;
if (product < 10) {
result[index] = product + result[index];
inc = 0;
if (result[index] >= 10) {
inc = result[index] / 10;
result[index] = result[index] % 10;
}
} else {
inc = product / 10;
result[index] = product % 10 + result[index];
if (result[index] >= 10) {
inc = inc + result[index] / 10;
result[index] = result[index] % 10;
}
}
if (j == 0 && inc != 0) {
result[index - 1] = inc;//前面那一位
inc = 0;//进位已向左前进1位,别忘了置为0
}
}//for
}//for
if (inc != 0) {
result[0] = inc;
startIndex = 0;
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < result.length; i++) {
if (result[i] != 0) {
startIndex = i;
break;
}
}
for (int i = startIndex; i < sumLength; i++) {
sb.append(result[i]);
}
return sb.toString();
}//multiply
/**
* 长的数值、短的数值在上面或下面都无所谓
* Runtime: 45 ms
*
* @param num1
* @param num2
* @return
*/
public String multiply3(String num1, String num2) {
if ("0".equals(num1) || "0".equals(num2)) {
return "0";
}
if ("1".equals(num1)) {
return num2;
}
if ("1".equals(num2)) {
return num1;
}
int num1Length = num1.length();
int num2Length = num2.length();
int sumLength = num1Length + num2Length;//规律,比如123*456,有三个积,每次左移一位,都处理成同长的数组,,多出来的位当成0,然后相加。三位数*三位数则同长数组最长是6位
int[] arr1 = new int[sumLength];//存储结果
int leftMulti, rightMulti, product, inc = 0, startIndex = 0, index = 0;
for (int j = 0; j < num2Length; j++) {
rightMulti = Integer.parseInt(num2.charAt(num2Length - j - 1) + "");//从后往前取
for (int i = 0; i < num1Length; i++) {
index = sumLength - i - j - 1;
leftMulti = Integer.parseInt(num1.charAt(num1Length - i - 1) + "");//从后往前取
product = leftMulti * rightMulti + inc;
if (product < 10) {
arr1[index] = product + arr1[index];
inc = 0;
if (arr1[index] >= 10) {
inc = arr1[index] / 10;
arr1[index] = arr1[index] % 10;
}
} else {
inc = product / 10;
arr1[index] = product % 10 + arr1[index];
if (arr1[index] >= 10) {
inc = inc + arr1[index] / 10;
arr1[index] = arr1[index] % 10;
}
}
if (i == num1Length - 1 && inc != 0) {
arr1[index - 1] = inc;//前面那一位
inc = 0;//进位已向左前进1位,别忘了置为0
}
}//for
}//for
if (inc != 0) {
arr1[0] = inc;
startIndex = 0;
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < arr1.length; i++) {
if (arr1[i] != 0) {
startIndex = i;
break;
}
}
for (int i = startIndex; i < sumLength; i++) {
sb.append(arr1[i]);
}
return sb.toString();
}//multiply
/**
* 易于理解版,长的数值在上面,短的数值在下面
* Runtime: 47 ms, faster than 17.69% of Java online submissions for Multiply Strings.
*
* @param num1
* @param num2
* @return
*/
public String multiply2(String num1, String num2) {
if ("0".equals(num1) || "0".equals(num2)) {
return "0";
}
if ("1".equals(num1)) {
return num2;
}
if ("1".equals(num2)) {
return num1;
}
int num1Length = num1.length();
int num2Length = num2.length();
int sumLength = num1Length + num2Length;
int[] arr1 = new int[sumLength];
int[] arr2 = new int[sumLength];
String numsTop = num1Length > num2Length ? num1 : num2;
String numsBottom = num1Length <= num2Length ? num1 : num2;
int numsTopLength = numsTop.length();
int numsBottomLength = numsBottom.length();
int leftMulti, rightMulti, product, inc = 0, startIndex = sumLength - 1;
for (int j = 0; j < numsBottomLength; j++) {
rightMulti = Integer.parseInt(numsBottom.charAt(numsBottomLength - j - 1) + "");
for (int i = 0; i < numsTopLength; i++) {
leftMulti = Integer.parseInt(numsTop.charAt(numsTopLength - i - 1) + "");
product = leftMulti * rightMulti + inc;
int a = sumLength - i - j - 1;
if (product < 10) {
arr1[sumLength - i - j - 1] = product + arr1[sumLength - i - j - 1];
inc = 0;
if (arr1[sumLength - i - j - 1] >= 10) {
inc = arr1[sumLength - i - j - 1] / 10;
arr1[sumLength - i - j - 1] = arr1[sumLength - i - j - 1] % 10;
}
} else {
inc = product / 10;
arr1[sumLength - i - j - 1] = product % 10 + arr1[sumLength - i - j - 1];
if (arr1[sumLength - i - j - 1] >= 10) {
inc = inc + arr1[sumLength - i - j - 1] / 10;
arr1[sumLength - i - j - 1] = arr1[sumLength - i - j - 1] % 10;
}
}
if (i == numsTopLength - 1 && inc != 0) {
arr1[sumLength - i - j - 1 - 1] = inc;//前面那一位
inc = 0;//进位已向左前进1位,别忘了置为0
}
// 9*9 = 81时会报错
// startIndex = sumLength - i - j - 1;//结果数值的起始位置,首位为0时,startIndex=1,表示从arr1[1]开始是数值
}//for
}//for
if (inc != 0) {
arr1[0] = inc;
startIndex = 0;
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < arr1.length; i++) {
if (arr1[i] != 0) {
startIndex = i;
break;
}
}
for (int i = startIndex; i < sumLength; i++) {
sb.append(arr1[i]);
}
return sb.toString();
}//multiply
}
end