数字插入构造最大数问题 | 豆包MarsCode AI刷题

78 阅读4分钟

本题的任务是将一个非负整数 bbb 插入到一个正整数 aaa 的某个位置,以构造出可能的最大数。插入位置可以在 aaa 的每一位之间(包括最前面或最后面)。

示例分析:

  1. 样例 1:a=76543,b=4a = 76543, b = 4a=76543,b=4

    • 将 b=4b = 4b=4 插入 aaa 的所有可能位置:

      • 插入最前面:476543476543476543
      • 插入第 1 位后:746543746543746543
      • 插入第 2 位后:764543764543764543
      • 插入第 3 位后:765443765443765443
      • 插入第 4 位后:765434765434765434
      • 插入最后:765434765434765434
    • 最大值为 765443765443765443。

  2. 样例 2:a=12,b=15a = 12, b = 15a=12,b=15

    • 将 b=15b = 15b=15 插入 aaa 的所有可能位置:

      • 插入最前面:151215121512
      • 插入第 1 位后:115211521152
      • 插入最后:121512151215
    • 最大值为 151215121512。

  3. 样例 3:a=1,b=0a = 1, b = 0a=1,b=0

    • 插入 b=0b = 0b=0 到 a=1a = 1a=1 的位置,结果分别为 010101 和 101010。
    • 最大值为 101010。

解题思路

  1. 遍历插入位置:

    • 遍历 aaa 的每一位,将 bbb 插入到该位置,形成一个新数字。
  2. 构造新数:

    • 将 aaa 分为两部分:前半部分和后半部分。
    • 插入 bbb 后,新的数字为:前半部分 + bbb + 后半部分。
  3. 更新最大值:

    • 每次计算出的新数字与当前最大值比较,更新最大值。
  4. 最终输出:

    • 遍历结束后,输出最大的数字。

代码实现

java
复制代码
public class Main {
    public static int solution(int a, int b) {
        // 将 a 和 b 转换为字符串,便于插入操作
        String aStr = String.valueOf(a);
        String bStr = String.valueOf(b);

        // 初始化最大值为最小的可能数
        int maxValue = Integer.MIN_VALUE;

        // 遍历插入位置
        for (int i = 0; i <= aStr.length(); i++) {
            // 构造新的数字
            String newNumber = aStr.substring(0, i) + bStr + aStr.substring(i);
            // 更新最大值
            maxValue = Math.max(maxValue, Integer.parseInt(newNumber));
        }

        return maxValue;
    }

    public static void main(String[] args) {
        // 测试样例
        System.out.println(solution(76543, 4) == 765443); // true
        System.out.println(solution(1, 0) == 10); // true
        System.out.println(solution(44, 5) == 544); // true
        System.out.println(solution(666, 6) == 6666); // true
        System.out.println(solution(12, 15) == 1512); // true
    }
}

代码解析

  1. 字符串转换:

    • 将数字 aaa 和 bbb 转换为字符串,方便实现插入操作。
  2. 插入逻辑:

    • 遍历 iii 从 0 到 aStr.length()aStr.length()aStr.length()(包括最后一个位置),逐步将 bbb 插入 aaa 的各个位置。
  3. 最大值更新:

    • 每次生成的新数字转为整数后,与当前最大值比较,更新最大值。
  4. 返回结果:

    • 遍历完成后,返回最终最大值。

测试用例分析

  1. 样例 1:a=76543,b=4a = 76543, b = 4a=76543,b=4

    • 插入后可能的数字为 [476543, 746543, 764543, 765443, 765434]。
    • 最大值为 765443765443765443。
  2. 样例 2:a=12,b=15a = 12, b = 15a=12,b=15

    • 插入后可能的数字为 [1512, 1152, 1215]。
    • 最大值为 151215121512。
  3. 样例 3:a=1,b=0a = 1, b = 0a=1,b=0

    • 插入后可能的数字为 [01, 10]。
    • 最大值为 101010。
  4. 样例 4:a=44,b=5a = 44, b = 5a=44,b=5

    • 插入后可能的数字为 [544, 454]。
    • 最大值为 544544544。
  5. 样例 5:a=666,b=6a = 666, b = 6a=666,b=6

    • 插入后可能的数字为 [6666, 6666, 6666, 6666]。
    • 最大值为 666666666666。

复杂度分析

  1. 时间复杂度: O(n)O(n)O(n)

    • 遍历插入 bbb 的所有可能位置,次数与 aaa 的位数 nnn 成正比。
  2. 空间复杂度: O(n)O(n)O(n)

    • 新生成的字符串占用额外的空间。

总结

  1. 题目核心:

    • 需要找到一个合适的位置将 bbb 插入到 aaa 中,使得数字最大化。
    • 遍历所有可能的位置,比较生成的数字,找出最大值。
  2. 常见错误:

    • 忽略多位数 bbb 的插入处理。
    • 忘记检查插入最前和最后的情况。
  3. 改进方向:

    • 如果数字较大,可以尝试直接构造规律避免遍历,进一步优化性能。

通过该题,可以熟练掌握字符串操作和数字构造的基本技巧,同时提高对最大值构造问题的理解。