题目描述
解题思路
考虑定义双指针 i , j 分列数组左右两端,循环执行:
- 指针 i 从左向右寻找偶数;
 - 指针 jj从右向左寻找奇数;
 - 将 偶数 nums[i] 和 奇数 nums[j] 交换。
 
可始终保证: 指针 i 左边都是奇数,指针 j 右边都是偶数 
算法流程:
- 初始化: i , j 双指针,分别指向数组 nums 左右两端;
 - 循环交换: 当 i = j 时跳出;
- 指针 i 遇到奇数则执行 i = i + 1跳过,直到找到偶数;
 - 指针 j 遇到偶数则执行 j = j - 1 跳过,直到找到奇数;
 - 交换 nums[i] 和 nums[j] 值;
 
 - 返回值: 返回已修改的 nums 数组。
 
时间复杂度 O(N) : N 为数组 nums 长度,双指针 i, j 共同遍历整个数组。
空间复杂度 O(1) : 双指针 i, j 使用常数大小的额外空间。
class Solution {public int[] exchange(int[] nums) {int pre = 0;int after = nums.length - 1;while (pre <= after) {if (nums[pre] % 2 == 1) {pre++;} else if (nums[after] % 2 == 0) {after--;} else if (nums[after] % 2 == 1 && nums[pre] % 2 == 0) {int temp = nums[after];nums[after] = nums[pre];nums[pre] = temp;}}return nums;}}
