返回

0元素后置 - 数组新规,无 0 为患!

前端

0 元素后置:巧妙移动,数据重组

让我们携手探索移动零的神奇操作,将 0 元素整齐地安置在数组的末尾。我们不必拘泥于创建新数组的传统思维,完全可以在原数组上大显身手,让数据重新焕发光彩。

算法步骤:精简有序,一气呵成

  1. 指针腾挪,划分界限

    我们使用两个指针,ij,开始一段探险之旅。指针 i 指向非零元素,而指针 j 指向当前正在检查的位置。当 j 遇到一个非零元素时,我们会将 j 指向的元素与 i 指向的元素交换位置,然后将 ij 分别加一。

  2. 携手并进,逐一探索

    我们重复这个过程,直到 j 指向数组的末尾。这时,i 指向的元素就是非零元素的最后一个位置。我们只需要将所有位于 i 之后的元素替换为 0,就可以完成任务。

  3. 收尾工作,完美呈现

    最后,我们返回指针 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]

  1. 指针移动,非零元素归位

    • i 指向非零元素 1,j 指向当前正在检查的位置 0。
    • j 遇到一个非零元素 1,将 j 指向的元素 1 与 i 指向的元素 0 交换位置。
    • ij 分别加一,i 指向 1,j 指向 0。
  2. 指针前行,探索继续

    • j 指向当前正在检查的位置 0。
    • j 遇到一个零元素 0,不进行任何操作。
    • j 加一,指向 3。
  3. 指针相遇,任务完成

    • j 指向当前正在检查的位置 3,i 指向非零元素 1。
    • 将所有位于 i 之后的元素替换为 0。
  4. 数组重塑,焕然一新

    最终,数组变为 [1,3,12,0,0],所有非零元素依次排列,零元素移至数组末尾。

结语:从无序到有序,数据新生

移动零算法向我们展示了如何巧妙地调整数组元素,让数据重新焕发生机。我们通过使用两个指针和交换操作,在原数组上完成了移动零的任务,既节约了空间,又保证了算法的效率。掌握了这个算法,你就可以轻松应对类似的问题,让你的代码更加出色!