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

47 阅读3分钟

问题描述

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

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

测试样例

样例1:

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

样例2:

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

样例3:

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

问题理解

题目要求将一个数字插到另一个数字以形成一个最大的可能数字。

解题思路

  1. 将输入的数字 a 转换为字符串 aStr。将字符串 aStr 转换为字符数组 aArray,便于逐位处理数字

  2. 创建一个 StringBuilder 对象 result,用于构建最终的结果字符串

  3. 使用变量 inserted 来标记是否已经插入了数字 b

  4. 如果当前字符 aArray[i] 小于 b,则将 b 插入到当前位置,并将 inserted 标记为 true

  5. 如果遍历结束后 b 还没有插入,则将 b 插入到 result 的末尾

  6. 将 result 转换为字符串,然后转换为整数并返回

代码详解

public static int solution(int a, int b) {
        String aStr = String.valueOf(a);
        char[] aArray = aStr.toCharArray();
        StringBuilder result = new StringBuilder();

        // 遍历 aArray,找到合适的位置插入 b
        boolean inserted = false;
        for (int i = 0; i < aArray.length; i++) {
            if (!inserted && aArray[i] - '0' < b) {
                result.append(b);
                inserted = true;
            }
            result.append(aArray[i]);
        }

        // 如果 b 还没有插入,插入到最后
        if (!inserted) {
            result.append(b);
        }
        return Integer.parseInt(result.toString());
    }

复杂度计算

空间复杂度:O(n),其中 n 是数字 a 的位数。

时间复杂度:O(n),其中 n 是数字 a 的位数。

知识点总结

  1. 字符串转换和遍历

  2. 条件判断

  3. StringBuilder 的使用:StringBuilder result = new StringBuilder();``result.append(b); 和 result.append(aArray[i]);:在 StringBuilder 中追加字符或数字。

  4. 使用布尔变量 inserted 标记是否已经插入了数字 b,当已被标记说明当前数字已经是最大的了,不用再继续后面的遍历,直接跳出循环,避免重复插入。

其他方法

  1. 二分查找
  • 将数字 a 转换为字符串。
  • 使用二分查找找到插入位置,使得插入后的数字最大。

时间复杂度:O(n log n),其中 n 是数字 a 的位数。

空间复杂度:O(n),用于存储字符串和结果。

  1. 双指针:
  • 将数字 a 转换为字符串。
  • 使用双指针找到插入位置,使得插入后的数字最大。

时间复杂度:O(n),其中 n 是数字 a 的位数。

空间复杂度:O(n),用于存储字符串和结果。

  1. 递归:
  • 将数字 a 转换为字符串。
  • 使用递归找到插入位置,使得插入后的数字最大。

时间复杂度:O(n),其中 n 是数字 a 的位数。

空间复杂度:O(n),用于存储字符串和结果。

作者:Hewson
链接:juejin.cn/post/744230…
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。