本文主要记录豆包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)。