大数和中的极值位距离 | 豆包MarsCode AI刷题

98 阅读2分钟

问题描述

有两个超大字符串数,问它们的和得到的字符串中的最大数和最小数之间相差多少位?如果都是一样的数则位数为 0,如果有多个数,则取符合条件的最小值。

输入格式

  • 第一行是一个字符串数
  • 第二行是一个字符串数

输出格式

  • 最大数和最小数之间的位数

输入样例(1)

111

222

输出样例(1)

0

输入样例(2)

111

34

输出样例(2)

1

数据范围

  • 两数都为非 0 的正整数

思路

  1. 字符串相加

    • 使用 addStrings 方法将两个字符串形式的数字相加。
    • 从两个字符串的末尾开始逐位相加,处理进位,并将结果存储在一个新的字符串中。
  2. 找到最大和最小数

    • 遍历相加后的字符串,找到其中的最大和最小数字。
  3. 计算位数差

    • 如果最大数和最小数相同,返回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);
    }
}