数字插入问题 | 豆包MarsCode AI刷题

51 阅读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

样例4:

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

问题分析

给定两个数字 ab,要求将数字 b 插入到数字 a 的某个位置,使得最终得到的数字尽可能大。我们可以把 ab 转换为字符串,并在字符串 a 中的不同位置插入 b,然后比较所有可能的结果,最终返回最大的数字。

关键点:

  • 字符串插入问题:我们需要在数字 a 的各个位置插入数字 b,从而生成不同的候选结果。

  • 插入位置:插入的位置包括:

    1. 在字符串 a 的开头插入 b
    2. 在 a 的每两个相邻字符之间插入 b
    3. 在 a 的末尾插入 b
  • 比较结果:我们要比较所有的插入结果,选择出最大的那个。

解题思路

  1. 将数字转化为字符串:为了方便操作,我们可以将数字 a 和数字 b 都转化为字符串,这样我们就可以在 a 中任意位置插入字符串 b

  2. 比较每种插入方式的结果:我们需要遍历 a 的每个位置,将数字 b 插入该位置,然后比较不同插入位置得到的结果。最终,我们选择最大的结果。

  3. 插入过程

    • 将数字 b 插入到 a 的每个位置上,形成一个新的数字字符串。
    • 比较所有插入后的字符串,找到最大的那个。
  4. 考虑插入的位置:我们可以在 a 的开头、每个字符之间,或者结尾插入 b

步骤

  • 将 a 和 b 转化为字符串形式。
  • 遍历 a 字符串的每个位置,将 b 插入到该位置,生成新的数字字符串。
  • 比较所有的插入结果,选择最大的一个。

代码实现

def maxNumber(a: int, b: int) -> int:
    a_str = str(a)
    b_str = str(b)
    
    # 初始化最大数字为插入 b 到 a 后的第一个结果
    max_result = b_str + a_str  # 插入到最前面时的情况
    
    # 遍历 a_str 的每个位置,插入 b_str
    for i in range(len(a_str) + 1):
        # 生成插入后的数字字符串
        new_num = a_str[:i] + b_str + a_str[i:]
        # 更新最大结果
        if new_num > max_result:
            max_result = new_num
    
    # 返回结果,转换为整数
    return int(max_result)

代码说明:

  1. a_str = str(a) :将数字 a 转化为字符串。
  2. b_str = str(b) :将数字 b 转化为字符串。
  3. max_result = b_str + a_str:假设将 b 插入到 a 的最前面。
  4. for i in range(len(a_str) + 1) :遍历 a 字符串的每个位置,尝试将 b 插入到该位置。
  5. new_num = a_str[:i] + b_str + a_str[i:] :将 b_str 插入到 a_str 的第 i 个位置。
  6. if new_num > max_result:更新 max_result,确保得到最大值。
  7. return int(max_result) :最终返回最大结果,并转换为整数。

时间复杂度:

  • 将 a 转化为字符串的时间复杂度为 O(n),其中 n 是 a 的位数。
  • 遍历 a 的每个位置进行插入操作,总的时间复杂度为 O(n)
  • 总的时间复杂度是 O(n),其中 n 是 a 的位数。