📜  资质 |门 CS 1998 |问题 11(1)

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

资质 | 门 CS 1998 | 问题 11

简介

本题是 "资质门 CS 1998" 系列中的第 11 道问题,难度适中。该系列题目是一系列面向初学者的编程挑战,旨在提高编程基础和编程能力。

该问题要求编写一个程序,将一个整数数组中的所有偶数放在数组的前面,所有奇数放在数组的后面,同时保持奇数和偶数原本在数组中的相对位置不变。

难度

适中

涉及知识点
  • 数组遍历
  • 条件语句
  • 数组排序
要求
  • 编写一个函数 sortArrayByParity,接收一个整数类型数组作为输入参数。
  • 函数需要将数组中的偶数放在数组前面,奇数放在数组后面,并保持奇数和偶数的相对位置不变。
  • 不允许创建额外的数组或使用库函数。
  • 函数返回排序后的数组。
  • 数组中可能含有重复的元素,顺序需要保持不变。
  • 函数的时间复杂度应为 O(n)。
示例
# 示例1
输入: [3,1,2,4]
输出: [2,4,3,1]

# 示例2
输入: [1,2,3,4]
输出: [2,4,1,3]
解答步骤
  1. 定义指向数组开头的左指针 i 和指向数组末尾的右指针 j。
  2. 当左指针 i 小于右指针 j 时,执行以下步骤:
    1. 如果 nums[i] 是偶数,则 i++;
    2. 如果 nums[j] 是奇数,则 j--;
    3. 如果 nums[i] 是奇数,nums[j] 是偶数,交换 nums[i] 和 nums[j] 的值;
    4. 重复执行步骤 2。
  3. 返回排好序的数组。
代码片段
def sortArrayByParity(nums):
    i, j = 0, len(nums) - 1
    while i < j:
        if nums[i] % 2 == 0:
            i += 1
        elif nums[j] % 2 == 1:
            j -= 1
        else:
            nums[i], nums[j] = nums[j], nums[i]
            i += 1
            j -= 1
    return nums
总结

本题是一个经典的双指针问题,关键在于如何在不打乱数组元素顺序的情况下将奇偶数分开。使用双指针法,左指针 i 指向数组的第一个元素,右指针 j 指向数组的最后一个元素,当左指针小于右指针时,如果左指针指向的是奇数,右指针指向的是偶数,就交换两个数的位置。重复这个过程,直到左右指针相遇即可。该算法的时间复杂度为 O(n)。