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

51 阅读7分钟

问题描述

小U手中有两个数字a和b。第一个数字是一个任意的正整数,而第二个数字是一个非负整数。她的任务是将第二个数字b插入到第一个数字a的某个位置,以形成一个最大的可能数字。你需要帮助小U找到这个插入位置,输出插入后的最大结果。

思路分析

整体解题思路: 本题的核心思路是通过将非负整数b插入到正整数a的不同位置,然后比较得出能形成的最大数字。实现过程中,先把整数转化为字符串方便进行插入操作,接着考虑特殊情况(b为0时),再针对一般情况(b不为0)通过遍历所有可能插入位置来找出最大结果。

具体思路步骤: 首先,将输入的整数ab都转换为字符串类型,因为对字符串进行插入操作更加直观和方便操作,相比直接在整数上操作更容易实现插入ba中的逻辑。 然后判断b的值是否为0,如果b等于0,那么直接把b对应的字符串连接到a对应的字符串末尾,再将这个新字符串转换回整数返回即可。这是因为0插入到任何位置都不会使数字变得更大,放在末尾组成的数字就是符合要求的最大结果。例如a=1,b=0 时,组成10就是最大情况。 对于b不为0的一般情况,需要遍历a字符串的每一个可能插入位置,从最前面(索引为0)开始,一直到a字符串的末尾(索引为aStr.length(),包含在末尾插入的情况,所以循环条件是i<=aStr.length())。在每个位置插入b对应的字符串后,把得到的新字符串再转换回整数,通过不断比较这些新生成的整数,记录并更新其中的最大值,最后返回这个最大值,就是将b插入到a中能形成的最大数字对应的整数。

解题步骤

数据类型转换: 利用 String.valueOf()方法将输入的整数ab分别转换为字符串aStr和 bStr,为后续的字符串插入操作做准备。例如输入a=76543,经过转换后aStr就变为"76543",方便后续在这个字符串基础上进行插入b对应的字符串操作。 处理特殊情况(b为 0):通过 if(b==0)判断语句来处理 b等于0的情况。如果满足条件,直接使用字符串拼接操作将aStr和bStr连接起来(如aStr+bStr),然后通过Integer.parseInt()方法把拼接后的字符串再转换回整数并返回。比如a=1,b= 0时,先拼接得到"10",再转换回整数10返回。

处理一般情况(b不为0): 初始化一个变量maxNumber为Integer.MIN_VALUE,用于记录在不同位置插入b后生成的整数中的最大值。开启一个for循环,循环变量i从0开始,到aStr.length()结束(遍历所有可能插入位置)。在每次循环中:创建一个StringBuilder对象newNumber,并使用aStr进行初始化,StringBuilder可以高效地进行字符串修改操作,这里就是为了后续插入b对应的字符串做准备。使用 newNumber.insert(i, bStr)语句在newNumber的索引i位置插入b对应的字符串,实现了在a字符串不同位置插入b的操作。例如a= 76543(对应的aStr为"76543"),b= 4(对应的bStr为"4"),当i = 3时,插入后newNumber的内容就变为 "765443"。接着把newNumber通过toString()方法转换回字符串,再使用Integer.parseInt()方法将这个新字符串转换回整数,赋值给currentNumber,这个 currentNumber就是当前插入位置生成的新整数。使用maxNumber = Math.max(maxNumber, currentNumber)语句比较当前的最大数maxNumber和这次插入位置生成的新整数currentNumber的大小,将较大的值更新给maxNumber,这样经过整个循环后,maxNumber就保存了所有插入情况中生成的最大整数。最后返回maxNumber,也就是将b插入到a中能形成的最大可能数字对应的整数。

代码解释和注释

public class Main {
    // solution方法用于解决将非负整数b插入正整数a的某个位置,以形成最大数字的问题,接收两个整数参数a和b,并返回插入后形成的最大数字对应的整数
    public static int solution(int a, int b) {
        // 将整数a转换为字符串,方便后续进行插入操作等处理
        String aStr = String.valueOf(a);
        // 将整数b转换为字符串
        String bStr = String.valueOf(b);

        // 如果b的值为0,直接将b对应的字符串连接到a对应的字符串末尾,再转换回整数返回
        // 因为0插入到任何位置都不会使数字变得更大,放在末尾组成的数字就是最大结果
        if (b == 0) {
            return Integer.parseInt(aStr + bStr);
        }

        // 初始化一个变量maxNumber,用于记录在不同位置插入b后生成的整数中的最大值,初始化为整数类型能表示的最小值
        int maxNumber = Integer.MIN_VALUE;

        // 遍历aStr字符串的每一个可能插入位置,从索引0开始到aStr的长度(包含末尾位置,所以是<=)
        for (int i = 0; i <= aStr.length(); i++) {
            // 创建一个StringBuilder对象newNumber,并初始化为aStr的内容,用于高效地进行字符串插入操作
            StringBuilder newNumber = new StringBuilder(aStr);
            // 在newNumber的索引i位置插入bStr对应的字符串,实现了在a字符串不同位置插入b的操作
            newNumber.insert(i, bStr);
            // 将插入操作后的newNumber转换回字符串,再转换回整数,得到当前插入位置生成的新整数
            int currentNumber = Integer.parseInt(newNumber.toString());
            // 使用Math.max方法比较当前的最大数maxNumber和这次插入位置生成的新整数currentNumber的大小
            // 将较大的值更新给maxNumber,这样循环结束后maxNumber就保存了所有插入情况中生成的最大整数
            maxNumber = Math.max(maxNumber, currentNumber);
        }

        // 返回找到的最大整数,也就是将b插入到a中能形成的最大可能数字对应的整数
        return maxNumber;
    }

    // main方法是Java程序的入口方法,用于测试solution方法的正确性
    public static void main(String[] args) {
        // 调用solution方法传入参数76543和4,验证返回结果是否等于预期的765443,并输出比较结果(布尔值)
        System.out.println(solution(76543, 4) == 765443);
        // 调用solution方法传入参数1和0,验证返回结果是否等于预期的10,并输出比较结果(布尔值)
        System.out.println(solution(1, 0) == 10);
        // 调用solution方法传入参数44和5,验证返回结果是否等于预期的544,并输出比较结果(布尔值)
        System.out.println(solution(44, 5) == 544);
        // 调用solution方法传入参数666和6,验证返回结果是否等于预期的6666,并输出比较结果(布尔值)
        System.out.println(solution(666, 6) == 6666);
    }
}

总结

本题旨在解决将非负整数b插入正整数a的特定位置以形成最大数字的问题。 思路上,先把a、b转成字符串,若b为0则直接拼接返回,不为0时遍历a字符串各位置插入b字符串,比较生成整数大小取最大值。 时间复杂度方面,将整数转字符串耗时相对少可忽略,核心是遍历a字符串长度n次的循环,每次循环内关键操作复杂度近似为O(n),整体时间复杂度为O(n²)。 空间复杂度上,定义的变量中字符串空间与a位数相关为O(n),循环中StringBuilder对象占用空间也取决于a位数,综合来看空间复杂度是O(n),n表示输入数字a的位数。整体代码结构清晰,功能实现明确。