LC.offer.21 调整数组顺序使奇数位于偶数前面 - 图1

思路:双指针

  • 左指针left起始值设置为0,右指针right起始值设置为len(nums) - 1
  • 不断移动,使得左指针停在左边的第一个偶数上,右指针停在右边的第一个奇数上
  • 两个指针交换所在位置的数字
  • 不断重复这个过程,直到 left < right这个条件不成立,说明已经全部交换完毕了。
  • 双端队列也可以做,但是没有双指针巧妙

    代码:python

  1. class Solution:
  2. # 双指针
  3. def exchange(self, nums: List[int]) -> List[int]:
  4. left, right = 0, len(nums) - 1
  5. while left < right:
  6. while left < right and (nums[left] & 1):
  7. left += 1
  8. while left < right and not (nums[right] & 1):
  9. right -= 1
  10. # 此时left指向左边第一个偶数,right指向右边第一个奇数
  11. # 交换
  12. temp = nums[left]
  13. nums[left] = nums[right]
  14. nums[right] = temp
  15. return nums