📜  门| GATE CS 2021 |套装2 |问题25(1)

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

门| GATE CS 2021 |套装2 |问题25

这是一道GATE CS 2021 |套装2中的编程问题,要求编写一个程序来实现指定任务。下面是本题的详细描述:

你需要编写一个程序来读取一个整数数组。接下来,你需要将该数组中的所有0值移动到末尾,并且将所有非零值保持相对顺序不变。你需要原地处理该数组,并且不使用任何其他数组。

输入格式:

输入的第一行包含一个整数n,表示数组中的元素数量。

输入的第二行包含n个整数a1,a2,a3,…,an,表示给定的数组。

输出格式:

输出修改后的数组,每个元素之间用空格隔开。

示例输入:
5
0 1 0 3 12
示例输出:
1 3 12 0 0
解题思路:

这是一道非常典型的数组操作题目。我们可以使用两个指针来实现该操作。假设我们的数组为nums,非零值的指针为p,所有值的指针为q。初始化p=q=0。然后我们遍历该数组,每次遇到一个非零值时,将其交换到nums[p]的位置,并将p+1。最后,我们将nums[p:]的所有值设为0即可。

解题代码:
def moveZeroes(nums: List[int]) -> None:
    """
    Do not return anything, modify nums in-place instead.
    """
    p = q = 0
    while q < len(nums):
        if nums[q] != 0:
            nums[p], nums[q] = nums[q], nums[p]
            p += 1
        q += 1
    nums[p:] = [0] * (len(nums) - p)

本题的解题思路和解题代码都比较简单,但需要注意的点是,在Python中,函数的参数是值传递,而非引用传递,所以我们需要将传入的nums参数声明为可变的(即List类型),才能够在函数中原地修改该数组。