问题描述
小R面对一个问题,她有两个由数字字符组成的超大字符串数,需要求出这两个数相加后得到的字符串数中的最大数和最小数之间的位数差距。如果结果中所有数字都相同,则差距为 0。如果存在多个符合最大或最小条件的数,应该选择最小的位置差。
例如,字符串数 "111" 和 "222" 相加得到 "333",所有数字相同,因此位数差为 0。另一例子,字符串数 "111" 和 "34" 相加得到 "145",其中最大数是 '5' 位于第 3 位,最小数是 '1' 位于第 1 位,他们之间的位差为 1。
算法选择
模拟 + hash
算法思路
-
初始化变量:
n1和n2分别表示string1和string2的长度减一,即从字符串的末尾开始计算。carry表示进位,初始值为 0。ans是一个StringBuilder,用于存储相加后的结果。max和min分别表示相加结果中的最大和最小数字,初始值分别为 -1 和 10。
-
模拟相加过程:
- 在
n1或n2大于 -1,或者carry不为 0 的情况下,继续循环。 - 在每次循环中,计算当前位的和
cur,包括进位carry,string1的当前位(如果存在),以及string2的当前位(如果存在)。 - 更新
max和min为cur的个位数one的最大和最小值。 - 计算新的进位
carry为cur除以 10 的商。 - 将
one添加到ans的末尾。 - 将
n1和n2分别减 1。
- 在
-
处理最后的进位:
- 如果最后的进位
carry不为 0,将其添加到ans的末尾。
- 如果最后的进位
-
确定最大和最小数字的位置:
- 如果
max等于min,则所有数字相同,位数差为 0。 - 否则,将
ans反转得到最终结果res。 - 遍历
res,记录max和min出现的所有位置到maxIndex和minIndex列表中。
- 如果
-
计算最小的位数差:
- 遍历
maxIndex和minIndex中的所有位置组合,计算它们之间的绝对差值减 1。 - 选择最小的差值作为最终答案。
- 遍历
代码展示
import java.util.*;
public class Main {
public static int solution(String string1, String string2) {
int n1 = string1.length() - 1;
int n2 = string2.length() - 1;
int carry = 0;
StringBuilder ans = new StringBuilder();
int max = -1;
int min = 10;
while (n1 > -1 || n2 > -1 || carry != 0) {
int cur = carry;
if (n1 > -1) {
cur += string1.charAt(n1) - '0';
}
if (n2 > -1) {
cur += string2.charAt(n2) - '0';
}
int one = cur % 10;
max = Math.max(max, one);
min = Math.min(min, one);
carry = cur / 10;
ans.append(one);
n1--;
n2--;
}
ans.append(carry);
if (max == min) {
return 0;
}
String res = ans.reverse().toString();
List<Integer> maxIndex = new ArrayList<>();
List<Integer> minIndex = new ArrayList<>();
for (int i = 0; i < res.length(); i++) {
if (res.charAt(i) == max + '0') {
maxIndex.add(i);
} else if (res.charAt(i) == min + '0') {
minIndex.add(i);
}
}
int dif = Integer.MAX_VALUE;
for (int ma : maxIndex) {
for (int mi : minIndex) {
dif = Math.min(dif, Math.abs(ma - mi)-1);
}
}
return dif;
}
public static void main(String[] args) {
// You can add more test cases here
System.out.println(solution("111", "222") == 0);
System.out.println(solution("111", "34") == 1);
System.out.println(solution("5976762424003073", "6301027308640389") == 6);
}
}