简单题26:小U的数字插入问题

40 阅读2分钟

问题描述

小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

这道题目的核心在于找到最佳的插入位置,使得插入数字 b 后形成的新数字最大。

解题思路:

  1. 字符串转换: 为了方便插入操作,将输入的整数 ab 转换为字符串 a_strb_str

  2. 初始化最大值: 假设将 b 插入到 a 的最前面,得到一个初始的最大值 num_max

  3. 遍历插入位置: 遍历 a_str 的所有可能插入位置 (包括开头和结尾)。

    • 在每个位置 i,将 b_str 插入到 a_str[:i]a_str[i:] 之间,得到一个新的字符串 current_num
    • 比较 current_numnum_max 的大小,如果 current_num更大,则更新 num_max
  4. 返回结果: 遍历结束后,将 num_max 转换回整数类型并返回。

def solution(a: int, b: int) -> int:
    a_str = str(a)
    b_str = str(b)

    # 初始化最大值为插入到最前面的情况
    num_max = b_str + a_str

    # 遍历插入位置
    for i in range(len(a_str) + 1):
        current_num = a_str[:i] + b_str + a_str[i:]
        if current_num > num_max:
            num_max = current_num

    return int(num_max)

if __name__ == '__main__':
    print(solution(76543, 4) == 765443)
    print(solution(1, 0) == 10)
    print(solution(44, 5) == 544)
    print(solution(666, 6) == 6666)

代码分析:

  • 时间复杂度为 O(n),其中 n 是 a 的位数。
  • 使用了字符串切片 a_str[:i]a_str[i:] 来实现字符串的拼接。