数据结构
数组常用操作
遍历、查找、翻转,刷题必会
数组常用操作
列表(数组)的三种高频操作:遍历、查找、翻转。LeetCode 里几乎每题都会用到其中一种或多种。
怎么遍历数组
按元素遍历
只关心值、不关心下标时,用 for x in nums 最简洁。
加载代码编辑器中…
按下标遍历
需要下标时用 range(len(nums)),或更推荐的 enumerate。
加载代码编辑器中…
倒序遍历
从后往前:用 reversed(range(len(nums))) 或切片下标。
加载代码编辑器中…
双指针遍历
两端的下标 left, right 往中间走,常用于「反转、两数之和、判断回文」等。
加载代码编辑器中…
怎么查找数组
是否存在:in
判断某个值是否在列表中,用 in(线性扫描,O(n))。
加载代码编辑器中…
找下标:index()
找第一个等于目标值的下标;找不到会抛 ValueError。
加载代码编辑器中…
找所有下标
需要「所有等于 x 的下标」时,用 enumerate 遍历一遍。
加载代码编辑器中…
有序数组查找:二分
数组已排序时,用二分查找可以 O(log n)。Python 标准库有 bisect,详见 二分与 bisect。
加载代码编辑器中…
怎么翻转数组
得到新列表:切片 [::-1]
不修改原列表,得到反转后的新列表,最常用。
加载代码编辑器中…
原地反转:reverse()
直接改原列表,无返回值(返回 None)。
加载代码编辑器中…
双指针原地反转
面试常考「手写原地反转」:用左右指针交换元素。
加载代码编辑器中…
小结
| 需求 | 写法 | 是否改原列表 |
|---|---|---|
| 要新列表 | nums[::-1] | 否 |
| 原地反转 | nums.reverse() | 是 |
| 手写原地反转 | 双指针交换 | 是 |