华为OD面试真题题库
专栏:华为OD面试真题题库
目录: 最新华为OD面试手撕代码真题目录以及八股文真题目录
1. python 常用的数据结构都有什么
-
列表(List):
- 功能:列表是可变的序列,能够存储不同类型的元素。
- 特点:支持增加、删除、访问元素等操作,支持索引和切片操作。
- 使用场景:适用于需要顺序访问的情况,或当你需要经常修改数据时。
-
元组(Tuple):
- 功能:元组是不可变的序列,一旦创建便不能修改。
- 特点:比列表访问速度快,可以用作字典的键(以及其他原生不可变类型)。
- 使用场景:适用于存储不应改变的数据元素,如函数的返回值。
-
字典(Dictionary):
- 功能:字典存储键值对,其中键必须是唯一的。
- 特点:通过键而非索引访问元素,查找速度快。
- 使用场景:适用于通过键快速检索、插入或删除数据项的场景。
-
集合(Set):
- 功能:集合是一个无序的元素集,自动去除重复元素。
- 特点:提供高效的成员检查,可以进行数学上的集合操作,如并集、交集、差集等。
- 使用场景:适用于需要元素唯一性的场景,或需要进行集合运算的地方。
-
字符串(String):
- 功能:字符串是字符的不可变序列。
- 特点:提供丰富的方法和操作,如切片、连接、查找等。
- 使用场景:处理文本数据的任何场景。
-
双端队列(Deque):
- 功能:来自collections模块,Deque是一个从两端都可以快速增加和弹出的队列。
- 特点:当你需要一个从头部和尾部都可以快速添加或删除的列表时,比列表更有效。
- 使用场景:适用于需要队列操作的场景,如在任务队列的头部或尾部添加或移除任务。
-
堆(Heap):
- 功能:通过
heapq
模块实现,堆是一个特殊的完全二叉树。 - 特点:在堆中,最小元素总是位于顶部。
heapq
提供了操作堆的方法,如heappush
和heappop
。 - 使用场景:适用于需要频繁访问最小元素但不需要全部排序的数据结构。
- 功能:通过
2. 需要大量的查询, 而且删除与插入很少, 那么应该用链表还是数组?
在面对这样的场景,即需要大量的查询操作,而且删除与插入操作很少时,通常使用数组(在Python中表现为列表)而不是链表。
-
查询效率:
- 数组:数组提供通过索引的直接访问,其访问时间复杂度为 O(1)。这意味着无论要访问数组中的哪个元素,所需时间都是常数级别的。
- 链表:链表的查询效率较低,因为链表不支持随机访问。要访问链表中的一个元素,可能需要从头节点开始逐一访问后续节点,最坏情况下的时间复杂度为 O(n),n 是链表长度。
-
插入与删除操作:
- 虽然链表在插入和删除操作时通常优于数组(因为链表的插入和删除操作时间复杂度为 O(1),而数组为 O(n)),但应用场景中这些操作较少,这一优势并不明显。
-
内存利用率:
- 数组:数组在内存中占用连续空间,这有助于数据的快速访问,但可能需要在扩展大小时重新分配整个数组空间。
- 链表:链表的内存分布是分散的,每个节点除了存储数据外,还需要额外的空间存储指向下一个节点的指针(或者在双向链表中,还有指向前一个节点的指针)。这会增加额外的内存开销。
3. 数组与元组有什么区别
在Python中,数组(通常指列表)和元组是两种基本的数据结构,它们都可以用来存储一系列的元素。它们的主要区别在于可变性、用途和性能方面:
-
可变性(Mutability):
- 列表(List):列表是可变的,意味着你可以在创建后添加、删除或更改其元素。
- 元组(Tuple):元组是不可变的,一旦创建,你不能修改其内容。这包括不能添加、删除或更改存储在元组中的元素。
-
性能:
- 由于元组的不可变性,它们在某些情况下比列表具有更好的性能。例如,元组的创建速度通常比列表快,它们还可以作为字典中的键使用,而列表则不能,因为字典的键必须是不可变类型。
-
用途: