豆包46 大数和中的极值位距离

109 阅读3分钟

问题描述

小R面对一个问题,她有两个由数字字符组成的超大字符串数,需要求出这两个数相加后得到的字符串数中的最大数和最小数之间的位数差距。如果结果中所有数字都相同,则差距为 0。如果存在多个符合最大或最小条件的数,应该选择最小的位置差。

例如,字符串数 "111" 和 "222" 相加得到 "333",所有数字相同,因此位数差为 0。另一例子,字符串数 "111" 和 "34" 相加得到 "145",其中最大数是 '5' 位于第 3 位,最小数是 '1' 位于第 1 位,他们之间的位差为 1。

算法选择

模拟 + hash

算法思路

  1. 初始化变量

    • n1 和 n2 分别表示 string1 和 string2 的长度减一,即从字符串的末尾开始计算。
    • carry 表示进位,初始值为 0。
    • ans 是一个 StringBuilder,用于存储相加后的结果。
    • max 和 min 分别表示相加结果中的最大和最小数字,初始值分别为 -1 和 10。
  2. 模拟相加过程

    • 在 n1 或 n2 大于 -1,或者 carry 不为 0 的情况下,继续循环。
    • 在每次循环中,计算当前位的和 cur,包括进位 carrystring1 的当前位(如果存在),以及 string2 的当前位(如果存在)。
    • 更新 max 和 min 为 cur 的个位数 one 的最大和最小值。
    • 计算新的进位 carry 为 cur 除以 10 的商。
    • 将 one 添加到 ans 的末尾。
    • 将 n1 和 n2 分别减 1。
  3. 处理最后的进位

    • 如果最后的进位 carry 不为 0,将其添加到 ans 的末尾。
  4. 确定最大和最小数字的位置

    • 如果 max 等于 min,则所有数字相同,位数差为 0。
    • 否则,将 ans 反转得到最终结果 res
    • 遍历 res,记录 max 和 min 出现的所有位置到 maxIndex 和 minIndex 列表中。
  5. 计算最小的位数差

    • 遍历 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);
    }
}