返回
0元素后置 - 数组新规,无 0 为患!
前端
2023-09-05 10:29:37
0 元素后置:巧妙移动,数据重组
让我们携手探索移动零的神奇操作,将 0 元素整齐地安置在数组的末尾。我们不必拘泥于创建新数组的传统思维,完全可以在原数组上大显身手,让数据重新焕发光彩。
算法步骤:精简有序,一气呵成
-
指针腾挪,划分界限 :
我们使用两个指针,
i
和j
,开始一段探险之旅。指针i
指向非零元素,而指针j
指向当前正在检查的位置。当j
遇到一个非零元素时,我们会将j
指向的元素与i
指向的元素交换位置,然后将i
和j
分别加一。 -
携手并进,逐一探索 :
我们重复这个过程,直到
j
指向数组的末尾。这时,i
指向的元素就是非零元素的最后一个位置。我们只需要将所有位于i
之后的元素替换为 0,就可以完成任务。 -
收尾工作,完美呈现 :
最后,我们返回指针
i
的初始位置,作为移动后非零元素的个数,让数组重焕生机。
代码实现:简洁高效,一览无遗
def move_zeros(nums):
"""
移动数组中所有的 0 到数组的末尾,同时保持非零元素的相对顺序。
:param nums: 给定的数组
:type nums: List[int]
:return: 无
:rtype: None
"""
# 初始化指针
i = 0
j = 0
# 循环遍历数组
while j < len(nums):
# 如果当前元素非零
if nums[j] != 0:
# 将当前元素与 i 指向的元素交换位置
nums[i], nums[j] = nums[j], nums[i]
# 将 i 指针加一
i += 1
# 将 j 指针加一
j += 1
# 将所有位于 i 之后的元素替换为 0
for k in range(i, len(nums)):
nums[k] = 0
# 返回非零元素的个数
return i
示例解析:数据流动,清晰明了
让我们通过一个简单的示例来感受算法的魅力:
输入数组:[0,1,0,3,12]
-
指针移动,非零元素归位 :
i
指向非零元素 1,j
指向当前正在检查的位置 0。j
遇到一个非零元素 1,将j
指向的元素 1 与i
指向的元素 0 交换位置。i
和j
分别加一,i
指向 1,j
指向 0。
-
指针前行,探索继续 :
j
指向当前正在检查的位置 0。j
遇到一个零元素 0,不进行任何操作。j
加一,指向 3。
-
指针相遇,任务完成 :
j
指向当前正在检查的位置 3,i
指向非零元素 1。- 将所有位于
i
之后的元素替换为 0。
-
数组重塑,焕然一新 :
最终,数组变为
[1,3,12,0,0]
,所有非零元素依次排列,零元素移至数组末尾。
结语:从无序到有序,数据新生
移动零算法向我们展示了如何巧妙地调整数组元素,让数据重新焕发生机。我们通过使用两个指针和交换操作,在原数组上完成了移动零的任务,既节约了空间,又保证了算法的效率。掌握了这个算法,你就可以轻松应对类似的问题,让你的代码更加出色!