青训营笔记之大数和中的极值位距离 | 豆包MarsCode AI刷题

34 阅读3分钟

问题描述

小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 = "999",string2 = "1"
输出:0

样例4:

输入:string1 = "525",string2 = "474"
输出:0

解题思路

先将两个超大字符串数相加,得到一个新的字符串数。这个过程可通过 addStrings 函数实现,它从两个字符串的末尾开始逐位相加,并处理进位,最终得到相加后的结果。然后在相加后的字符串中找到最大和最小的数字。通过遍历字符串,可以更新 maxDigit 和 minDigit 的值。最后计算最大数和最小数之间的位数差。如果最大数和最小数相同,则位数差为0。否则,我们需要找到最大数和最小数在字符串中的位置,并计算它们之间的距离。这个过程通过遍历字符串并记录最大数和最小数的位置来实现。

算法步骤

  1. 字符串相加

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

    • 遍历相加后的字符串,找到最大和最小的数字。
    • 初始化 maxDigit 为 '0',minDigit 为 '9'。
    • 遍历字符串中的每个字符,更新 maxDigit 和 minDigit
  3. 计算位数差

    • 初始化 left 为 -1,right 为字符串长度。
    • 遍历字符串,找到 minDigit 和 maxDigit 的位置。
    • 计算 minDigit 和 maxDigit 之间的位数差,并更新 res
    • 返回最终的位数差。

代码实现

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;
        }
        if(maxDigit == minDigit) return 0;
        int left =-1, right = sum.length();
        int res = right - left - 1;
        // 3. 计算位数差
        for(int i = 0; i <sum.length(); i++){
            if(sum.charAt(i) == minDigit){
                left = i;
                res = Math.min(res, Math.abs(left - right) -1);
            }
            if(sum.charAt(i) == maxDigit){
                right = i;
                res = Math.min(res, Math.abs(left - right) -1);
            }
        }
        return res;

    }

    // 字符串相加函数
    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();
    }