📅  最后修改于: 2023-12-03 15:37:16.264000             🧑  作者: Mango
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)$。