AI刷题之小U的数字插入问题 | 豆包MarsCode AI刷题

175 阅读4分钟

“小U的数字插入问题”题目要求

一、问题描述

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

二、测试样例

样例1:

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

样例2:

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

样例3:

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

样例4:

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


三、题目解析

3.1代码思路

  1. 字符串转换:将 a 和 b 转换为字符串,便于插入操作。
  2. 遍历插入位置:遍历 strA 的每个位置,尝试将 strB 插入到该位置。
  3. 比较结果:使用 compareTo 方法比较字符串,选择最大的结果。
  4. 返回结果:将最终的字符串结果转换回整数并返回。

3.2详细代码

public class Main {
    public static int solution(int a, int b) {
        // 将 a 转换为字符串
        String strA = Integer.toString(a);
        // 将 b 转换为字符串
        String strB = Integer.toString(b);
        
        // 初始化最大结果为插入到最前面的情况
        String maxResult = strB + strA;
        
        // 遍历 strA 的每个位置,尝试插入 strB
        for (int i = 0; i <= strA.length(); i++) {
            // 构造插入后的字符串
            String candidate = strA.substring(0, i) + strB + strA.substring(i);
            
            // 比较并更新最大结果
            if (candidate.compareTo(maxResult) > 0) {
                maxResult = candidate;
            }
        }
        
        // 将最大结果转换回整数并返回
        return Integer.parseInt(maxResult);
    }

    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);
    }
}

四、知识总结

代码主要涉及如何利用字符串操作、贪心算法和简单的单元测试来解决一个最大化问题。主要思想是通过字符串的拼接和比较来构建所有可能的候选组合,然后找到字典序最大的组合,从而得到最终结果。在编写类似的代码时,理解如何将问题分解成小步骤(如转换类型、拼接字符串、比较字符串等)是关键。同时,贪心算法在解决此类最大化、最小化问题时具有很好的应用价值。

1. 字符串和整数之间的转换

将整数 ab 转换为字符串形式,这样可以方便地操作每个字符,插入或拼接字符串等操作。使用Integer.toString()Integer.parseInt() 方法在字符串和整数之间相互转换。

2. 字符串拼接与插入操作

遍历 strA 的过程中,代码尝试将 strB 插入到 strA 的各个位置。插入操作通过 substring 和字符串拼接 (+) 实现,这种插入方式的复杂度较低,但能有效生成所有插入位置的可能组合。

3. 比较字符串的字典序

compareTo 方法用来按字典序比较字符串。代码将插入 b 后的每个候选字符串与当前的最大字符串进行比较,确保结果始终保持字典序最大的组合。这种方法可以保证在所有候选结果中选择字典序较大的,从而获得最终的最大整数值。

4. 遍历与更新

代码用循环将 b 插入到 a 中的每一个可能的位置,并在每次迭代时比较生成的新组合是否比当前最大组合大,如果是,则更新最大组合。这种“生成候选结果并逐步更新”的方式属于一种简单的贪心算法思路,逐步优化结果。

5. 贪心算法的思想

在每一步选择当前最优的结果,最终得到全局最优解。在这里,选择插入位置的过程就是一个“选择最优局部解”的过程,通过不断比较并更新最大值达到全局最优。贪心算法的应用通常需要满足无后效性,即当前选择不影响后续选择,而插入的每个位置可以单独计算,因此该问题满足贪心策略的应用条件。