5. 使用sorted()对复杂列表进行排序
大量的编码面试问题需要进行某种排序,并且有多种有效的方法可以进行排序。除非面试官希望你实现自己的排序算法,否则通常最好使用sorted()。你可能已经看到了排序的最简单用法,例如按升序或降序排序数字或字符串列表:
默认情况下,sorted()已按升序对输入进行排序,而reverse关键字参数则按降序排序。
值得了解的是可选关键字key,它允许你在排序之前指定将在每个元素上调用的函数。添加函数允许自定义排序规则,如果要对更复杂的数据类型进行排序,这些规则特别有用:
通过传入一个返回每个元素年龄的lambda函数,可以轻松地按每个字典的单个值对字典列表进行排序。在这种情况下,字典现在按年龄按升序排序。
有效利用数据结构
算法在面试中得到了很多关注,但数据结构可能更为重要。在coding面试环境中,选择正确的数据结构会对性能产生重大影响。除了理论数据结构之外,Python还在其标准数据结构实现中内置了强大而方便的功能。这些数据结构在面试中非常有用,因为它们默认为你提供了许多功能,让你可以将时间集中在问题的其他部分。
1. 使用set存储唯一值
我们通常需要从现有数据集中删除重复元素。新的开发人员有时会在列表应该使用集合时执行此操作,这会强制执行所有元素的唯一性。
假装你有一个名为get_random_word()的函数。它将始终从一小组单词中返回一个随机选择:
你应该重复调用get_random_word()以获取1000个随机单词,然后返回包含每个唯一单词的数据结构。以下是两种常见的次优方法和一种好的方法。
糟糕的方法
get_unique_words()将值存储在列表中,然后将列表转换为集合:
这种方法并不可怕,但它不必要地创建了一个列表,然后将其转换为集合。面试官几乎总是注意到(并询问)这种类型的设计选择。
更糟糕的做法
为避免从列表转换为集合,你现在可以在不使用任何其他数据结构的情况下将值存储在列表中。然后,通过将新值与列表中当前的所有元素进行比较来测试唯一性:
这比第一种方法更糟糕,因为你必须将每个新单词与列表中已有的每个单词进行比较。这意味着随着单词数量的增加,查找次数呈二次方式增长。换句话说,时间复杂度在O(N^2)的量级上增长。
优秀的方法
现在,