这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战
问题描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组的前半部分,所有偶数在数组的后半部分。
示例:
输入:[1,2,3,4]
输出:[1,3,2,4]
分析问题
这道题我们可以使用双指针法来求解,具体思路如下。
- 首先,申请两个指针i和j,分别指向数组nums的左右两端,即i=0,j=n-1。
- 当i所指的位置为奇数时,执行i=i+1,直到遇到偶数。
- 当j所指的位置为偶数时,执行j=j+1,直到遇到奇数。
- 然后交换nums[i]和nums[j]的值
- 重复上述操作,直到i==j为止。
下面我们来看一下代码的实现。
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)。