问题描述
有两个超大字符串数,问它们的和得到的字符串中的最大数和最小数之间相差多少位?如果都是一样的数则位数为 0,如果有多个数,则取符合条件的最小值。
输入格式
- 第一行是一个字符串数
- 第二行是一个字符串数
输出格式
- 最大数和最小数之间的位数
输入样例(1)
111
222
输出样例(1)
0
输入样例(2)
111
34
输出样例(2)
1
数据范围
- 两数都为非 0 的正整数
思路
-
字符串相加:
- 使用
addStrings方法将两个字符串形式的数字相加。 - 从两个字符串的末尾开始逐位相加,处理进位,并将结果存储在一个新的字符串中。
- 使用
-
找到最大和最小数:
- 遍历相加后的字符串,找到其中的最大和最小数字。
-
计算位数差:
- 如果最大数和最小数相同,返回0。
- 否则,遍历字符串,找到所有最大数和最小数的索引。
- 计算每对最大数和最小数的索引差,并更新最小差值
minDiff。 - 返回最小差值
minDiff。
代码实现
public class Main {
public static int solution(String string1, String string2) {
// 1. 字符串相加
String sum = addStrings(string1, string2);
// 2. 找到最大和最小数
char maxDigit = '0';
char minDigit = '9';
for (char c : sum.toCharArray()) {
if (c > maxDigit) {
maxDigit = c;
}
if (c < minDigit) {
minDigit = c;
}
}
int minDiff = Integer.MAX_VALUE;
// 3. 如果有多个最大数或最小数,找到索引差最小的那对
if (maxDigit != minDigit) {
for (int i = 0; i < sum.length(); i++) {
if (sum.charAt(i) == maxDigit) {
for (int j = 0; j < sum.length(); j++) {
if (sum.charAt(j) == minDigit) {
int diff = Math.abs(i - j);
if (diff < minDiff) {
minDiff = diff;
}
}
}
}
}
return minDiff - 1;
} else {
return 0;
}
}
// 实现字符串相加的方法
private static String addStrings(String num1, String num2) {
StringBuilder result = new StringBuilder();
int carry = 0;
int i = num1.length() - 1;
int j = num2.length() - 1;
// 从末尾开始逐位相加
while (i >= 0 || j >= 0 || carry > 0) {
int digit1 = (i >= 0) ? num1.charAt(i--) - '0' : 0;
int digit2 = (j >= 0) ? num2.charAt(j--) - '0' : 0;
int sum = digit1 + digit2 + carry;
carry = sum / 10;
result.append(sum % 10);
}
// 结果需要反转
return result.reverse().toString();
}
public static void main(String[] args) {
System.out.println(solution("111", "222") == 0);
System.out.println(solution("111", "34") == 1);
System.out.println(solution("5976762424003073", "6301027308640389") == 6);
}
}