简单题:小U的数字插入问题| 豆包MarsCode AI刷题

59 阅读3分钟

题目要求

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

思路分析

我能想到的就是使用暴力搜索法(Brute Force)来解决问题,即将 b 逐一插入 a 的每一个可能位置,得到所有组合后,再从中找出最大值。比较简单直接,易于理解,可能效率比较低。

代码实现

public class Main {

    public static int solution(int a, int b) {
        int maxnum = 0; // 用于存储生成的最大结果
        List<String> list = new ArrayList<>(); // 用于存储所有可能的插入结果字符串
        String s = String.valueOf(a); // 将 a 转换为字符串,方便插入操作
        String d = String.valueOf(b); // 将 b 转换为字符串,方便插入操作

        // 遍历 a 的每个可能插入位置
        for (int i = 0; i <= s.length(); i++) {
            StringBuilder sb = new StringBuilder();
            sb.append(a); // 初始内容为字符串形式的 a
            sb.insert(i, d); // 在第 i 个位置插入字符串形式的 b
            list.add(sb.toString()); // 将生成的结果添加到列表中
        }

        // 遍历所有生成的字符串结果,找到最大值
        for (String string : list) {
            int num = Integer.parseInt(string); // 将字符串转换为整数
            if (num > maxnum) {
                maxnum = num; // 更新最大值
            }
        }

        return maxnum; // 返回最大可能结果
    }

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

知识点总结

  • 字符串与整数转换:理解如何在字符串和整数之间进行高效转换,便于后续的数值操作。
  • 字符串插入操作:掌握 StringBuilder 的插入方法,能够灵活处理字符串的修改。
  • 集合与遍历:通过 ArrayList 来存储中间结果,并通过遍历找到所需的最大值。

个人思考

虽然我解决了这道题,但是我感觉写的代码在效率和代码简洁上还不行!自己尝试优化了几次,发现效果总是差强人意,我把我的代码给AI进行了优化,并同时给我许多学习建议,不得不感叹AI真的强!!给大家(其实给我自己)看一下吧,希望自己以后也可以达到这种水平。

代码优化

public class Main {
    public static int solution(int a, int b) {
        int maxnum = 0; // 初始化为 0
        String s = String.valueOf(a);
        String d = String.valueOf(b);

    for (int i = 0; i <= s.length(); i++) { // <= 以便在末尾插入
        StringBuilder sb = new StringBuilder(s);
        sb.insert(i, d); // 在第 i 个位置插入 b
        int num = Integer.parseInt(sb.toString()); // 转换为整数

        if (num > maxnum) {
            maxnum = num;
        }
    }
    return maxnum;
}

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

好简洁,优雅,省去了很多不必要的代码。

学习建议

  1. 提升算法效率:考虑优化方法,例如贪心算法,在遍历的过程中即时判断插入位置,从而减少无效计算。贪心算法可以直接找到最佳位置,而无需生成所有组合。
  2. 数据结构的选择:当前代码使用 ArrayList 来存储每一个可能结果,在简单场景中可行。但在处理大规模数据时,这种方法的开销会明显增加。可以考虑直接在生成时判断大小,省略 ArrayList
  3. 代码简洁性:在插入并找到最大值时,可以去掉不必要的集合使用,减少变量数量,使代码逻辑更清晰。
  4. 学习替代算法:在这类问题中,可以学习动态规划、贪心策略等常用算法,以便在解决更复杂的数值组合问题时拥有更多选择。

小菜鸟在不断进步~~~一起加油!  (2024.11.06)