面试题答案
一键面试large_list = list(range(1, 1000001))
large_list[999::1000] = [num ** 2 for num in large_list[999::1000]]
时间复杂度分析
- 列表切片操作
large_list[999::1000]
:获取切片的时间复杂度为 $O(k)$,其中 $k$ 是切片中的元素数量。这里 $k = \frac{1000000}{1000}=1000$,所以这部分时间复杂度为 $O(1000)$,即 $O(n)$,$n$ 是列表长度。 - 列表推导式
[num ** 2 for num in large_list[999::1000]]
:遍历切片并计算平方值,时间复杂度为 $O(k)$,同样为 $O(n)$。 - 重新赋值操作
large_list[999::1000] = [num ** 2 for num in large_list[999::1000]]
:时间复杂度也是 $O(k)$,即 $O(n)$。
总体时间复杂度为 $O(n)$,因为所有操作的时间复杂度都是线性的。
空间复杂度分析
- 切片操作
large_list[999::1000]
:会创建一个新的列表对象,包含 $k$ 个元素,空间复杂度为 $O(k)$,即 $O(n)$。 - 列表推导式
[num ** 2 for num in large_list[999::1000]]
:会创建一个新的列表对象,包含 $k$ 个平方值,空间复杂度为 $O(k)$,即 $O(n)$。 - 重新赋值操作不会增加额外的空间复杂度。
总体空间复杂度为 $O(n)$,因为主要的空间开销来自于创建两个新的列表,它们的长度都是 $O(n)$。