青训营X豆包MarsCode技术训练营第三课 | 豆包MarsCode AI 刷题

41 阅读4分钟

问题描述

小U手中有两个数字 a 和 b。第一个数字是一个任意的正整数,而第二个数字是一个非负整数。她的任务是将第二个数字 b 插入到第一个数字 a 的某个位置,以形成一个最大的可能数字。

你需要帮助小U找到这个插入位置,输出插入后的最大结果。

样例

样例1:

输入:a = 76543, b = 4
输出:765443

样例2:

输入:a = 1, b = 0
输出:10

样例3:

输入:a = 44, b = 5
输出:544

样例4:

输入:a = 666, b = 6
输出:6666

问题题解

  1. 问题理解:我们的目标是将b插入到a中,以形成一个新的、尽可能大的数字。这意味着我们需要考虑b相对于a中每个数字的大小。
  2. 字符串表示:将a和b转换为字符串,这样可以方便地在任意位置插入b。这种表示方法允许我们在不直接操作数字的情况下进行比较和插入操作。
  3. 寻找插入点:从a的最高位开始,比较b与a中的每个数字。我们寻找第一个b大于a中数字的位置,或者如果b小于或等于a中的所有数字,则将b插入到a的末尾。这一步是关键,因为它决定了b应该插入到哪里以最大化结果数字。
  4. 构造最大数字:一旦确定了插入位置,我们就可以将b插入到a中,形成一个新的数字。这一步涉及到字符串操作,将b插入到a的相应位置,并重新组合字符串以形成最终的数字。
  5. 特殊情况:如果b为0,应将其插入到a的开头,因为这是形成最大数字的唯一方式。如果b大于a中的所有数字,也应该将其插入到a的开头。
  6. 实现:通过遍历a的每个位置,将b插入到这些位置,并比较形成的新数字,我们可以找到最大的一个。这种方法虽然简单,但有效,因为它确保我们考虑了所有可能的插入位置。
  7. 优化考虑:在实际操作中,我们可以通过一些优化来减少不必要的比较。例如,如果b是一个多位数,我们可以先比较b的第一位与a中的数字,这样可以快速排除一些不可能的位置。
  8. 总结:这个问题的解决关键在于理解数字的比较和插入操作,以及如何通过字符串操作来实现这些操作。通过这种方法,我们可以确保找到插入b以形成最大可能数字的最优位置。这种方法不仅适用于小数字,也适用于大数字,因为它不依赖于数字的大小,而是依赖于数字的相对顺序。

通过这种方法,我们可以确保找到插入b以形成最大可能数字的最优位置。这种方法不仅适用于小数字,也适用于大数字,因为它不依赖于数字的大小,而是依赖于数字的相对顺序。通过这种方式,我们可以确保在各种情况下都能得到正确的结果。

代码分析

public class Main {
    public static int solution(int a, int b) {
        String strA = Integer.toString(a);
        String strB = Integer.toString(b);

        // 遍历字符串 a,找到合适的插入位置
        for (int i = 0; i < strA.length(); i++) {
            if (strB.charAt(0) > strA.charAt(i)) {
                // 如果 b 的第一个字符大于当前字符的值,则将 b 插入到当前位置
                return Integer.parseInt(strA.substring(0, i) + strB + strA.substring(i));
            }
            if (strA.charAt(i) == strB.charAt(0)) {
                int j = 1;
                while (j < strB.length() && i + j < strA.length()) {
                    if (strB.charAt(j) > strA.charAt(i + j)) {
                        // 如果 b 的后续字符大于 a 的后续字符,则将 b 插入到当前位置
                        return Integer.parseInt(strA.substring(0, i) + strB + strA.substring(i));
                    } else if (strB.charAt(j) < strA.charAt(i + j)) {
                        // 如果 b 的后续字符小于 a 的后续字符,则继续遍历
                        break;
                    }
                    j++;
                }
            }
        }

        // 如果没有找到合适的插入位置,则将 b 插入到最后
        return Integer.parseInt(strA + strB);
    }

    public static void main(String[] args) {
        System.out.println(solution(76543, 4) == 765443);
        System.out.println(solution(1, 0) == 10);
        System.out.println(solution(44, 5) == 544);
        System.out.println(solution(666, 6) == 6666);
    }
}