调整数组顺序使奇数位于偶数前面

589 阅读2分钟

这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战

问题描述

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组的前半部分,所有偶数在数组的后半部分。

示例:

输入:[1,2,3,4]

输出:[1,3,2,4]

分析问题

这道题我们可以使用双指针法来求解,具体思路如下。

  1. 首先,申请两个指针i和j,分别指向数组nums的左右两端,即i=0,j=n-1。
  2. 当i所指的位置为奇数时,执行i=i+1,直到遇到偶数。
  3. 当j所指的位置为偶数时,执行j=j+1,直到遇到奇数。
  4. 然后交换nums[i]和nums[j]的值
  5. 重复上述操作,直到i==j为止。

image-20211104114617098

image-20211104114642721

下面我们来看一下代码的实现。

class Solution(object):
    def exchange(self, nums):
        #申请两个变量i和j,开始时,指向数组的两端
        i=0
        j=len(nums)-1
        while i < j:
            #从i开始从左向右寻找,直到找到第一个偶数
            while i < j and nums[i] % 2 == 1:
                i = i + 1
            #从j开始从右想左寻找,直到找到第一个奇数
            while i < j and nums[j] % 2 == 0:
                j = j - 1
            nums[i], nums[j] = nums[j], nums[i]
        return nums

其实这道题我们还可以使用快慢指针法来求解,首先我们定义两个指针fast和slow,fast的作用是向前搜索奇数所在的位置,slow的作用是指向下一个奇数应当存放的位置。在fast向前移动的过程中,当它搜索到奇数时,将它和nums[slow]进行交换,然后让slow向前移动一个位置,重复上述操作,直到fast指向数组的末尾为止。

class Solution:
    def exchange(self, nums):
        slow = 0
        fast = 0
        #循环遍历,直到fast指向nums的末尾
        while fast < len(nums):
            #如果fast指向奇数,
            #交换nums[slow]和nums[fast]
            if nums[fast] % 2 == 1:
                nums[slow], nums[fast] = nums[fast], nums[slow]
                slow=slow+1
            fast=fast+1
        return nums

该算法的时间复杂度是O(n),空间复杂度是O(1)。