牛客地址
解题思路
2 | 1 | 3 | 1 | ||
3 | 9 | 9 | |||
18 | 9 | 27 | 9 | ||
18 | 9 | 27 | 9 | ||
6 | 3 | 9 | 3 | ||
6 | 21 | 36 | 39 | 36 | 9 |
8 | (21+4)%10=5 | (36+4)%10=0 | (39+3)%10=2 | 36%10=6 | 9 |
所以2131 * 399 = 850269
算法
- 初始化长度为sLen + tLen长度的数组tmp
- 然后双重遍历, tmp[i+j+1] += (s.charAt(i) - '0') * (t.charAt(j) - '0');
- 然后再从后往前遍历tmp, 利用进位加和取模,计算tmp每个位置的结果值
- 最后,因为结果的长度可能为sLen + tLen也可能为sLen + tLen - 1, 只需要跳过tmp数组开头的0即可,然后再构造返回结果字符串。
实现代码
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param s string字符串 第一个整数
* @param t string字符串 第二个整数
* @return string字符串
*/
public String solve (String s, String t) {
// write code here
if(s == null || "".equals(s) || t == null || "".equals(t)){
return "0";
}
int sLen = s.length();
int tLen = t.length();
int[] tmp = new int[sLen + tLen];
for(int i = sLen - 1; i >= 0; i--){
for(int j = tLen - 1; j >= 0; j--){
tmp[i+j+1] += (s.charAt(i) - '0') * (t.charAt(j) - '0');
}
}
int carry = 0;
int mod = 0;
for(int i = tmp.length - 1; i >= 0; i--){
int sum = tmp[i] + carry;
tmp[i] = sum % 10;
carry = sum / 10;
}
int index = 0;
while(index < tmp.length && tmp[index] == 0){
index ++;
}
StringBuilder sb = new StringBuilder();
for(int i = index; i < tmp.length; i++){
sb.append(tmp[i]);
}
String res = sb.toString();
if("".equals(res)){
return "0";
}
return res;
}
}