问题描述
小R面对一个问题,她有两个由数字字符组成的超大字符串数,需要求出这两个数相加后得到的字符串数中的最大数和最小数之间的位数差距。如果结果中所有数字都相同,则差距为0。如果存在多个符合最大或最小条件的数,应该选择最小的位置差。
例如,字符串数“111"和“222"相加得到“333”,所有数字相同,因此位数差为0。另一例子,字符申数“111"和"34"相加得到 "145",其中最大数是'5位于第3位,最小数是"1位于第1位,他们之间的位差为1。
测试样例
样例1:
输入:string1 - "111",string2 = "222"输出:0
样例2:
输入:string1 = "111",string2= "34"输出:1
样例3:
输入: string1 s "999",string2 ="1"输出:0
解题思路
-
将输入的字符串转换为BigInteger并相加:因为输入的字符串可能表示非常大的整数,所以使用
BigInteger
类来处理加法。 -
初始化变量:初始化最大字符
maxChar
为Character.MIN_VALUE
,最小字符minChar
为Character.MAX_VALUE
,以及分别用于存储最大和最小字符位置的列表maxIndices
和minIndices
。 -
遍历相加后的字符串:通过遍历字符串中的每个字符,更新最大字符和最小字符及其位置。
- 如果当前字符大于
maxChar
,则更新maxChar
,并清空maxIndices
列表,然后添加当前字符的位置。 - 如果当前字符等于
maxChar
,则直接添加当前字符的位置到maxIndices
列表。 - 类似地,处理最小字符及其位置。
- 如果当前字符大于
-
计算最小距离:通过双重循环遍历
maxIndices
和minIndices
列表,计算最大字符和最小字符之间的最小距离。 -
返回结果:如果最小距离为0,则返回0;否则,返回
minDistance - 1
。
代码实现
import java.math.BigInteger;
import java.util.*;
public class Main {
public static int solution(String string1, String string2) {
BigInteger sum = new BigInteger(string1).add(new BigInteger(string2));
String sumStr = sum.toString();
List<Integer> maxIndices = new ArrayList<>();
List<Integer> minIndices = new ArrayList<>();
char maxChar = Character.MIN_VALUE;
char minChar = Character.MAX_VALUE;
// 遍历字符串找到最大数和最小数及其位置
for (int i = 0; i < sumStr.length(); i++) {
char currentChar = sumStr.charAt(i);
if (currentChar > maxChar) {
maxChar = currentChar;
maxIndices.clear();
maxIndices.add(i);
} else if (currentChar == maxChar) {
maxIndices.add(i);
}
if (currentChar < minChar) {
minChar = currentChar;
minIndices.clear();
minIndices.add(i);
} else if (currentChar == minChar) {
minIndices.add(i);
}
}
// 找出最大数和最小数之间的最小距离
int minDistance = Integer.MAX_VALUE;
for (int maxIndex : maxIndices) {
for (int minIndex : minIndices) {
minDistance = Math.min(minDistance, Math.abs(maxIndex - minIndex));
}
}
int num = minDistance;
if(num==0)
num = 0;
else
num-=1;
return num ;
}
public static void main(String[] args) {
// 测试用例
System.out.println(solution("111", "222") == 0);
System.out.println(solution("111", "34") == 1);
System.out.println(solution("999", "1") == 0);
System.out.println(solution("525", "474") == 0);
System.out.println(solution("5976762424003073", "6301027308640389") == 6);
}
}