剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组的前半部分,所有偶数在数组的后半部分。
示例:
输入:nums = [1,2,3,4]
输出:[1,3,2,4]
注:[3,1,2,4] 也是正确的答案之一。
解题思路:
考虑定义双指针 i , j 分列数组左右两端,循环执行:
- 指针 i 从左向右寻找偶数;
- 指针 j 从右向左寻找奇数;
- 将 偶数 nums[i] 和 奇数 nums[j] 交换。
可始终保证: 指针 i 左边都是奇数,指针 j 右边都是偶数 。
java代码:
class Solution {
public int[] exchange(int[] nums) {
int i = 0, j = nums.length-1;
while (i < j) {
while (nums[i] % 2 != 0 && i < j) {
i++;
}
while (nums[j] % 2 == 0 && i < j) {
j--;
}
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
return nums;
}
}
go代码:
func exchange(nums []int) []int {
j := len(nums)-1
for i:= 0; i < j; {
for nums[i] % 2 != 0 && i < j {
i++
}
for nums[j] % 2 == 0 && i < j {
j--
}
var tmp = nums[i]
nums[i] = nums[j]
nums[j] = tmp
}
return nums
}
复杂度分析:
时间复杂度 O(N) : N 为数组 nums 长度,双指针 i, j 共同遍历整个数组。
空间复杂度 O(1) : 双指针 i, j 使用常数大小的额外空间。