📜  门| GATE-CS-2014-(Set-2) |问题 22(1)

📅  最后修改于: 2023-12-03 14:58:29.070000             🧑  作者: Mango

问题 22

该问题是门(计算机科学)的一部分,出现在Gate-CS-2014-(Set-2)考试中。

问题描述:

给定一个包含n个整数的无序列表A,你需要使用一个线性时间复杂度(O(n))的算法,将这个列表A中所有的负数移动到列表的左侧,将所有的正数移动到列表的右侧,并保持其原始顺序不变。

你需要实现一个函数segregate_numbers(A: List[int]) -> List[int],该函数接收一个整数列表A,并返回一个排序后的列表。

例子:

输入:

A = [10, -1, 20, 4, 5, -9, -6]

输出:

[-1, -9, -6, 10, 20, 4, 5]

输入:

A = [-12, 11, -13, -5, 6, -7, 5, -3, -6]

输出:

[-12, -13, -5, -7, -3, -6, 11, 6, 5]

注意:

  • 你需要原地修改输入列表A,并返回修改后的列表。
  • 你可以使用额外的O(1)空间。

你可以按照以下步骤实现函数:

  1. 初始化两个指针leftright,分别指向列表的起始和结束位置。
  2. while循环遍历列表,当left小于等于right时执行以下步骤:
    • A[left]为负数时,将left指针右移一位。
    • A[left]为正数时,交换A[left]A[right]的值,然后将right指针左移一位。
  3. 循环结束后,你会得到一个已排序的列表。

根据上述思路,你可以实现以下代码:

from typing import List

def segregate_numbers(A: List[int]) -> List[int]:
    left = 0
    right = len(A) - 1

    while left <= right:
        if A[left] < 0:
            left += 1
        else:
            A[left], A[right] = A[right], A[left]
            right -= 1

    return A

你可以使用以下方式测试函数:

print(segregate_numbers([10, -1, 20, 4, 5, -9, -6]))  # [-1, -9, -6, 10, 20, 4, 5]
print(segregate_numbers([-12, 11, -13, -5, 6, -7, 5, -3, -6]))  # [-12, -13, -5, -7, -3, -6, 11, 6, 5]

这个算法的时间复杂度为O(n),其中n是列表A的长度。它通过使用两个指针,在原地修改列表A,将所有负数移到左侧,而正数移到右侧,并保持其原始顺序不变。