题目描述
解题思路
考虑定义双指针 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;
}
}