题目
教练使用整数数组 actions 记录一系列核心肌群训练项目编号。为增强训练趣味性,需要将所有奇数编号训练项目调整至偶数编号训练项目之前。请将调整后的训练项目编号以 数组 形式返回。
示例 1:
输入:actions = [1,2,3,4,5]
输出:[1,3,5,2,4]
解释:为正确答案之一
提示:
0 <= actions.length <= 50000
0 <= actions[i] <= 10000
题解
本题目考虑定义双指针解决。指针 i,j 分列数组左右两端,循环执行:
- 指针i从左向右寻找偶数;
- 指针j从右向左寻找奇数;
- 将偶数actions[i]和 奇数actions[j]交换。
这样可始终保证: 指针 i 左边都是奇数,指针 j 右边都是偶数 。

通过对2取余可判断是不是奇数,此处可以使用位运算来快速取余 actions[i] & 1
。
python
class Solution(object):
def trainingPlan(self, actions):
"""
:type actions: List[int]
:rtype: List[int]
"""
i,j = 0, len(actions) - 1
while i < j:
while i < j and actions[i] % 2 == 1: i += 1
while i < j and actions[j] % 2 == 0: j -= 1
actions[i], actions[j] = actions[j], actions[i]
return actions
- 时间复杂度O(N): N为数组actions长度,双指针i,j共同遍历整个数组。
- 空间复杂度O(1):双指针i,j使用常数大小的额外空间。