📌  相关文章
📜  国际空间研究组织 | ISRO CS 2020 |问题 59(1)

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

国际空间研究组织 | ISRO CS 2020 |问题 59

ISRO CS 2020是印度国际空间研究组织(ISRO)的计算机科学招聘考试,旨在雇用最优秀的研发人员和工程师来推进ISRO的科学研究和技术创新。

问题描述

给定一个整数数组,在保持原始顺序不变的情况下将所有非零元素移动到数组的左侧,并将所有零元素移动到数组的右侧,同时最小化非零元素的移动次数。

实现一个函数来解决这个问题。

函数原型:

def move_zeros(nums: List[int]) -> List[int]:
示例
assert move_zeros([0,1,0,3,12]) == [1,3,12,0,0]
assert move_zeros([5,0,6,1,0,3,10]) == [5,6,1,3,10,0,0]
思路

题目要求将非零元素移动到左侧,零元素移动到右侧,同时最小化非零元素的移动次数。

一种简单的方法是遍历数组,依次把非零元素放到左侧,零元素放到右侧。在这个过程中,维护一个指针来指示当前已经处理的位置,一个计数器来记录已经处理的非零元素的数量,一个临时变量来交换元素。

时间复杂度为 $O(n)$,空间复杂度为 $O(1)$。

参考代码如下:

from typing import List

def move_zeros(nums: List[int]) -> List[int]:
    i = 0  # 指针
    count = 0  # 计数器
    n = len(nums)
    while i < n:
        if nums[i] != 0:  # 如果当前元素不为零
            if i != count:  # 如果当前元素不在左侧
                nums[count], nums[i] = nums[i], nums[count]  # 交换元素
            count += 1  # 计数器加1
        i += 1  # 指针移动
    return nums
总结

该问题可以通过遍历数组,并依次把非零元素放到左侧,零元素放到右侧来解决。这个过程中需要维护指针、计数器和临时变量,时间复杂度为 $O(n)$,空间复杂度为 $O(1)$。