📌  相关文章
📜  在随机整数数组中移动所有零开始和结束(1)

📅  最后修改于: 2023-12-03 15:23:38.291000             🧑  作者: Mango

在随机整数数组中移动所有零开始和结束

在处理数组时,经常需要将数组中的零移动到开始或者结尾位置,这里给出两种常用的方法。

方法一:双指针法

定义两个指针leftright,分别指向数组的开始和结束位置。当left指向的元素为零时,right开始向后遍历,直到找到第一个非零元素,然后交换两者。这样就将一个零移动到了结尾位置。重复进行这个过程,直到right走到数组的结尾位置,此时所有的零都已经被移动到了结尾。

接下来将left指针向后移动一个位置,重复上述的操作,将下一个零移到结尾。重复这个过程,直到left指针移动到数组的结尾位置,整个数组中所有的零都已经被移到了结尾。

def move_zeros(nums):
    left, right = 0, len(nums) - 1
    while left < right:
        while left < right and nums[left] != 0:
            left += 1
        while left < right and nums[right] == 0:
            right -= 1
        nums[left], nums[right] = nums[right], nums[left]
    return nums
方法二:遍历交换法

从数组的开头开始遍历,当遇到一个零时,从当前位置开始向后查找,直到找到第一个非零元素,交换两者。这样就将一个零移动到了结尾位置。重复进行这个过程,直到结束位置。

def move_zeros(nums):
    for i in range(len(nums)):
        if nums[i] == 0:
            j = i + 1
            while j < len(nums) and nums[j] == 0:
                j += 1
            if j == len(nums):
                break
            nums[i], nums[j] = nums[j], nums[i]
    return nums

上述两种方法的时间复杂度均为O(n),其中方法一的空间复杂度为O(1),方法二的空间复杂度为O(n)。在实际应用中,应该根据实际情况选择适合的方法。