题目解析:小U的数字插入问题 | 豆包MarsCode AI刷题

151 阅读3分钟

本文主要记录豆包MarsCode AI刷题:小U的数字插入问题的个人解题思路、完整代码和相关优化思路,如有错误,欢迎讨论指导。

题目描述

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

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

解决思路

找到插入后最大结果,就把数字a转换格式,分割每一位数字组成列表,将a转换为字符串列表,然后循环遍历(遍历从0到len(a)的所有位置,包括在a的末尾插入b的情况),在数组a的每一个位置插入b(注意:要将b转换为字符串格式才能插入成功),用join()方法将a中的字符串元素连接成一个字符串,然后转换格式为整数,比较并更新最大的可能数字,每次循环结束要记得移除刚刚插入的b,把a恢复成原状,以便进行下一次的插入操作,最后返回比较结果,即最大数字res。

完整代码

def solution(a: int, b: int) -> int:
    res=a
    a=list(str(a))
    for idx in range(len(a)+1):
        a.insert(idx,str(b))
        new_num=int(''.join(a))
        if new_num>=res:
            res=new_num
        a.pop(idx)
    return res

优化思路及对应代码

思路一:使用 reduce 函数

reduce函数是 Python 标准库 functools 中的一个函数,可以将一个二元操作函数应用于一个可迭代对象的所有元素,从而将它们“缩减”为一个单一的值。 因此,我们可以使用reduce函数将列表转换为字符串(使用lambda匿名函数),修改部分代码如下:

new_num = reduce(lambda x, y: x + y, a)  # 使用 reduce 将列表转换为字符串

思路二:使用列表推导式

列表推导式可以用于将列表中的元素连接成一个字符串,修改部分代码如下:

new_num = ''.join([char for char in a])

思路三:使用map函数

map 函数可以将一个函数应用于一个可迭代对象的所有元素,并返回一个迭代器,修改部分代码如下:

new_num = ''.join(map(str, a))

时空复杂度分析

  • 原代码:
    • 总的时间复杂度是 O(n^2),因为每次插入和移除操作都需要 O(n) 的时间,而我们需要进行 n 次这样的操作。
    • 总的空间复杂度是 O(n),存储和转换字符串的空间复杂度都是 O(n)
  • 思路一二三:
    • 时空复杂度无明显变化,总的时间复杂度仍是O(n^2),总的空间复杂度仍是O(n)

想要进一步优化,可以通过直接构造字符串,减少了插入和移除操作的次数,从而提高了算法的效率。虽然时间复杂度仍然是 O(n^2),但实际运行效率会有所提升。空间复杂度保持为 O(n)