【思路1】双指针 i , j 分别指向数组左右两端,循环找奇偶数
算法流程:
- 初始化: i , j 双指针,分别指向数组 nums 左右两端;
- 循环交换: 当 i = j 时跳出;
指针 i 遇到奇数,则执行 i = i + 1 跳过,直到找到偶数;
指针 j 遇到偶数,则执行 j = j - 1 跳过,直到找到奇数;
交换 nums[i] 和 nums[j] 值;
这里一定可以交换,如果没有,那就 i = j 退出循环了
- 返回值: 返回已修改的 nums 数组 (奇前 偶后)。
class Solution:
def exchange(self, nums):
i, j = 0, len(nums) - 1
while i < j:
# 当搜索到偶数时 跳出循环,此时的i是 该偶数的 下标
while i < j and nums[i] & 1 == 1: i += 1
# 当搜索到奇数时 跳出循环,此时的j是 该奇数的 下标
while i < j and nums[j] & 1 == 0: j -= 1
# 交换两个值
nums[i], nums[j] = nums[j], nums[i]
return nums
'''
作者:jyd
链接:https://leetcode-cn.com/problems/diao-zheng-shu-zu-shun-xu-shi-qi-shu-wei-yu-ou-shu-qian-mian-lcof/solution/mian-shi-ti-21-diao-zheng-shu-zu-shun-xu-shi-qi-4/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
'''
注:x&1 位运算 等价于 x%2 取余运算,即皆可用于判断数字奇偶性。
【思路2】双端队列
创建双端队列 deque,遍历数组,奇数前插入,偶数后插入
class Solution:
def exchange(self, nums):
odd = collections.deque()
l = len(nums)
for i in range(l):
if nums[l-i-1] % 2 != 0: # l-i-1 从后到前
odd.appendleft(nums[-i-1])
if nums[i] % 2 == 0: # i 从前到后
odd.append(nums[i])
return list(odd)