📅  最后修改于: 2023-12-03 14:58:29.070000             🧑  作者: Mango
该问题是门(计算机科学)的一部分,出现在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]
注意:
你可以按照以下步骤实现函数:
left
和right
,分别指向列表的起始和结束位置。while
循环遍历列表,当left
小于等于right
时执行以下步骤:A[left]
为负数时,将left
指针右移一位。A[left]
为正数时,交换A[left]
和A[right]
的值,然后将right
指针左移一位。根据上述思路,你可以实现以下代码:
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,将所有负数移到左侧,而正数移到右侧,并保持其原始顺序不变。